我所拥有的是mySQL查询,它将选择一些饮料并返回有关饮料的基本信息,以及该特定饮料的成分列表,以及特定饮品的评级。我有3桌饮料,饮料,饮料和饮料
所以,我的问题是,我想要获得有关含有伏特加的饮料的信息,并且在高球玻璃杯中我会运行下面的查询......
它有效,它只是我的问题是它不会返回所有成分。例如,如果我返回“randomDrinkName1”并且碰巧有伏特加和苏打水....当我得到信息时,它会丢弃苏打水,因为我说WHERE ing = voda,所以我理解为什么会发生这种情况。 ..but是否有一些其他类型的WHERE子句我可以检查它是否有“伏特加”并将其与所有其他可能也存在的成分信息一起返回?
我知道我可以在这个查询之前做一个查询,从我的drink_ing表中获取伏特加的查询。
但这看起来好像是个坏主意......比如,如果有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
答案 0 :(得分:2)
您最好的方法可能是使用自我加入。这是您引用同一个表两次,但名称不同的地方。大致这看起来像:
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"
答案 1 :(得分:1)
是的,您可以在一个查询中执行此操作。你的旅馆
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 a.id in (select distinct a.id
from drinks_ing c
ON a.id = c.did
where c.ing = "vodka"
)
这会找到你想要的饮料,并返回有关饮料的信息。