2012-09-20 20 views
7

はそうのように、私は、あなたが店で買うことができる人、食料品店、およびアイテムを持つデータベースを持っていると言います多対多および多対多の交差点

Inventory 
-------------------- 
| store_id| food_id| 
-------------------- 
| 1  | 1  | 
| 1  | 2  | 
| 2  | 1  | 
| 3  | 1  | 
| 3  | 2  | 
| 3  | 3  | 
-------------------- 

そして、私はそれ

Lists 
--------------------- 
| person_id| food_id| 
--------------------- 
| 1  | 1  | 
| 1  | 2  | 
| 1  | 3  | 
| 2  | 1  | 
| 2  | 3  | 
--------------------- 

私に買い物リストを持っている別のテーブルを持っている:店が何を売っているのを追跡するためのテーブル質問は、与えられた人、または彼らのID、どのような店に行くことができるかを把握するための最良の方法は何ですか、彼らはすべてのリストを取得します。 MySQLには、これらのタイプの計算のパターンがありますか?お時間を

-- Given that _pid is the person_id we want to get the list of stores for. 

SELECT stores.name, store_id, num, COUNT(*) AS counter 
FROM lists 
    INNER JOIN inventory 
     ON (lists.food_id=inventory.food_id) 
    INNER JOIN (SELECT COUNT(*) AS num 
      FROM lists WHERE person_id=_pid 
      GROUP BY person_id) AS T 
    INNER JOIN stores ON (stores.id=store_id) 
WHERE person_id=_pid 
GROUP BY store_id 
HAVING counter >= num; 

ありがとう:

私の試み(非常に醜いと乱雑に)のようなものです!

編集SQL Fiddle with Data

+2

おかげいますが、上のワーキングモデルを作成した場合はそれも良いだろう[SQLフィドル](http://sqlfiddle.com/) – Taryn

+1

そうですか? http://sqlfiddle.com/#!2/83667/6 – KLee1

+0

完璧、ありがとう! :) – Taryn

答えて

3

私は問題を解決した場合、私は、彼らのリンク列(特に外部キー)アイテムの数をカウントするHAVING句にサブクエリを持つ4つのテーブルを結合します各人のリストに表示されます。これを試してみて、

SET @personID := 1; 

SELECT c.name 
FROM Inventory a 
     INNER JOIN Foods b 
      ON a.food_id = b.id 
     INNER JOIN Stores c 
      ON a.store_id = c.id 
     INNER JOIN Lists d 
      ON d.food_id = b.id 
WHERE d.person_id = @personID 
GROUP BY c.name 
HAVING COUNT(DISTINCT d.food_id) = 
    (
     SELECT COUNT(*) 
     FROM Lists 
     WHERE person_ID = @personID 
    ) 

SQLFiddle Demo

+0

あなたは '@ personID'表記を必要とせずに、自分の買い物リストを満たすことができる店舗の名前と共に、単一の店舗として満足できるすべての人々を選択して、仕事全体を行うことができます。 –

+0

@JonathanLeffler私は、OPが望んでいることをOPに返答していました。「私の質問は、与えられた人、あるいはそのID ...」です。とにかく、私はちょうど答えを更新します:)ありがとう。 –

+0

ここにコーナーケースがありますか?その人が自分のリストに何もない場合はどうなりますか?その場合、彼らはどんな店にも行くことができます。この場合のif文だけを持つのが最善でしょうか? – KLee1

1

が@JohnWoo:なぜDISTINCT?

もう1 ...テーブルのDDL/DMLを投稿するための

SET @pid=2; 

SELECT store_id, name 
FROM inventory 
    JOIN lists ON inventory.food_id=lists.food_id 
    JOIN stores ON store_id=stores.id 
WHERE [email protected] 
GROUP BY store_id 
HAVING COUNT(*)=(
    SELECT COUNT(*) 
    FROM lists 
    WHERE [email protected] 
); 
関連する問題