当前位置: 首页 > 知识库问答 >
问题:

如果这些行中至少有一个具有给定值,则选择具有给定ID的所有行

江新
2023-03-14

我有一个mySQL查询,它将选择一些饮料并返回关于饮料的基本信息,以及该特定饮料的成分列表,以及该特定饮料的评级。我有三桌酒水,drinks_ratings,drinks_ing

所以,我的问题是,如果我想获得关于含有伏特加的饮料的信息,并且是在高球玻璃杯中,我会运行下面的查询...

它起作用了,只是我的问题是它没有返回所有的成分。例如,如果我返回“randomdrinkname1”,它碰巧有伏特加和苏打水....当我返回信息时,它漏掉了苏打水,因为我说了WHERE ing=voda,所以我理解为什么会发生这种情况...但是有没有其他类型的WHERE子句我可以检查它是否有“伏特加”,并返回它和所有其他成分信息,也可能在那里?

我知道我可以在这个查询之前做一个查询,从我的drinks_ing表中返回含有伏特加的ID。

但这似乎是个坏主意...就像如果有1000杯加伏特加的饮料,只是为了查询带有1000个或语句的select。

我感兴趣的是,如果有一种方法,我可以很容易地做到这一切在一个查询。谢谢!

select dIngs.id,
    dIngs.name,
    dIngs.descrip,
    dIngs.type,
    dIngs.ing,
    AVG(b.rating) as arating,
    COUNT(b.id) as tvotes
from (
    select a.id,
        a.name,
        a.descrip,
        a.type,
        concat (
            '[',
            GROUP_CONCAT('{\"ing\":', c.ing, ',\"parts\":', c.parts, '}'),
            ']'
            ) ing
    from drinks a
    left join drinks_ing c on a.id = c.did
    where c.ing = "vodka"
        and a.type = "highball"
    group by a.id
    ) dIngs
left join drinks_ratings b on dIngs.id = b.id
group by dIngs.id
order by arating desc,
    tvotes desc LIMIT 0,
    50;

编辑:以说明我想要得到的结果如下所示:

           [0]
              descrip = "the description text will be here"
              arating = 0
              id = 4
              ing = [ {"ing": "vodka", "parts": 4}, {"ing": "soda", "parts": 2}, {"ing": "sprite", "parts": 2} ]
              name = "awesomeDrink"
              type = "highball"
              tvotes = 0
           [0]
              descrip = "the description text will be here"
              arating = 0
              id = 4
              ing = [ {"ing": "vodka", "parts": 4} ]
              name = "awesomeDrink"
              type = "highball"
              tvotes = 0
drinks_ing
---------------
did (which is the drink id its associated with)
id (the id of the ingredient aka "vodka")
parts

drinks
---------------
id
name
description
type
timestamp

drinks_ratings
-----------------
id
userid
rating
timestamp

共有1个答案

金阳曜
2023-03-14

您最好的方法可能是使用self join。在这里,您可以两次引用同一个表,但名称不同。大致上,这看起来像:

SELECT     d.stuff
FROM       drinks d
INNER JOIN drinks v on d.id = v.id
WHERE      v.ingredient = "vodka"

更新:使其更好地与所讨论的表相对应。这是说:给出伏特加的所有成分,找出与伏特加成分相同的饮料中的所有成分。

SELECT     d.*
FROM       drinks_ing d
INNER JOIN drinks_ing v on d.did = v.did
WHERE      v.ing = "vodka"
 类似资料:
  • 我对SQL并不陌生,但我对Hibernate完全陌生。我预计,给定一个列值,从表中选择一组对象将是一项非常简单的任务。但我做不到。 我的导师和下面的这个问题都建议了同样的事情,这让我写了下面的代码: JPA:如何基于除ID之外的字段值获取实体? 这是可行的,但方法是已被弃用。由于我对hibernate还不熟悉,我不妨按照它的预期工作方式来学习它,所以我不想使用不推荐的方法。 官方的Hibernat

  • 问题内容: 雇员表具有ID和NAME列。名称可以重复。我想找出是否至少有一个名称类似“ kaushik%”的行。 因此查询应返回true / false或1/0。 是否可以使用单个查询找到它。如果我们尝试类似 在这种情况下,它不会返回true / false。另外,我们正在遍历表中的所有记录。简单SQL中是否存在这样的方式,使得每当获取满足条件的第一条记录时,它都应停止检查其他记录。还是只能在Pl

  • 问题内容: 如何从表中选择所有内容,并且如果列的值相同,则仅选择具有最大值的行,因此,如果有这样的表: 它只会选择ID最高的“ bob”,因此结果将返回: 谢谢你。 问题答案: 您可以使用子查询来计算每个名称的最大ID,然后返回与该子查询返回的ID匹配的所有行: 请看这里的小提琴。

  • 问题内容: 我需要找到属于特定条件的任何组的所有行。 我将一个组定义为在“组”列中共享一个值的几行。 相关组必须包含至少一行且Eligible设置为true的行,并且该组中至少有两行在Group或Eligible之外的任何列中必须彼此不同。 样表 所需结果 以下查询使我接近 问题在于它返回的结果太多,因为没有考虑该组中的记录之一是否被标记为合格。 我可能缺少一些简单的东西,但是我无法弄清楚如何检查

  • 问题内容: 在MySQL中: 如果我们有两个表: 和: 我想从意见表中具有相应的具有特定表(该列表)。 例如,我想选择所有从该行有一个表中的表: 我希望这些结果: 而如果我选择所有从该行表中有一个的在表: 我希望得到这样的结果: 我真的希望有人能提供帮助,谢谢大家! 我想我需要参加吗?任何指针都将是很好的,并且如果可能的话,可以做一个简短的解释,以便我可以找出我要去的地方->这样我下次就知道了!

  • 问题内容: 所以我有一个Java哈希图,如下所示: 我想删除所有值为“ Two”的项目 如果我做类似的事情: 只有第一个被删除,我想全部删除,该怎么做? 问题答案: 编辑: 这种简洁方法的(显着)缺点是您基本上被迫发表评论,说出类似 否则,一些好心的工程师将有一天会尝试为您简化并破坏它。发生这种情况…有时候好心做的事甚至是Future You!