我所拥有的是一个 mySQL 查询,它将选择一些饮料并返回有关该饮料的基本信息,以及该特定饮料的成分列表以及该特定饮料的评级。我有 3 桌酒水,drinks_ratings,drinks_ing
所以,我的问题是说我想获取有关含有伏特加的饮料的信息,并且在高球杯中,我将运行下面的查询......
它有效,只是我的问题是它不会返回所有成分。例如,如果我返回“randomDrinkName1”并且它恰好有伏特加和苏打水......当我得到信息时,它会忽略苏打水,因为我说 WHERE ing = voda,所以我明白为什么会发生这种情况。 ..但是我可以做一些其他类型的 WHERE 子句来检查它是否有“伏特加”并将其与所有其他可能存在的成分信息一起返回?
我知道我可以在这个查询之前做一个查询,从我的drinks_ing 表中获取包含伏特加的ID。
但这似乎是个坏主意……例如,如果有 1000 种带有伏特加的饮料只是为了对带有 1000 条 OR 语句的选择进行查询。
如果有一种方法可以让我在一个查询中轻松完成这一切,我很感兴趣。谢谢!
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
需要明确的是,如果我不提供类似的东西 where ing = vodka
,我会把所有的成分都拿回来就好了。那不是问题....
我需要它来检查其中一种潜在成分是否恰好是伏特加,然后基本上返回所有数据……如果伏特加不是潜在成分,则忽略该饮料并且不返回它。
编辑:我的桌子是什么样子的..
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