私が持っているのは、いくつかの飲み物を選択し、飲み物に関する基本情報、特定の飲み物の成分のリスト、および特定の飲み物の評価を返す mySQL クエリです。私は3つのテーブル飲み物、飲み物_評価、飲み物_を持っています
だから、私の問題は、ウォッカを含み、ハイボールグラスに入っている飲み物に関する情報を取得したいということです。以下のクエリを実行します...
それは機能しますが、私の問題は、すべての成分が返されないことです。たとえば、「randomDrinkName1」を返し、たまたまウォッカとソーダが入っていた場合....情報を取得すると、WHERE ing = vodaと言ったため、ソーダが除外されます。なぜこれが起こっているのか理解できます. ..しかし、「ウォッカ」が含まれているかどうかを確認し、そこにある可能性のある他のすべての成分情報と一緒に返すために実行できる他のタイプのWHERE句はありますか?
私は、このクエリの前に、drinks_ing テーブルからウォッカを含む ID を取得するクエリを実行できることを知っています。
しかし、これは悪い考えのようです...1000個のORステートメントを使用してselectでクエリを実行するためだけに、ウォッカが入った何千もの飲み物があった場合のように。
これをすべて1つのクエリで簡単に実行できる方法があるかどうかに興味があります。ありがとう!
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
、すべての成分を正常に戻します。それは問題ではありません....
潜在的な成分の 1 つがウォッカであるかどうかを確認し、基本的にすべての ing データを返す必要があります...ウォッカが潜在的な成分でない場合は、その飲み物を無視して返さないでください。
編集:私のテーブルがどのように見えるか..
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