2

私が持っているのは、いくつかの飲み物を選択し、飲み物に関する基本情報、特定の飲み物の成分のリスト、および特定の飲み物の評価を返す 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
4

2 に答える 2

2

最善のアプローチは、自己結合を使用することです。これは、同じテーブルを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"
于 2012-05-14T21:35:51.000 に答える
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"
               )

これにより、必要な成分を含む飲み物が検索され、飲み物に関する情報が返されます。

于 2012-05-10T18:25:27.643 に答える