2012-09-20 27 views
7

seni o kadar gibi deposunda satın alabilirsiniz insanlar, marketler ve öğeleri olan bir veritabanı var demek izlemek tablo hangi mağazalar satmak ne:-pek-çok ve çok sayıda çoğa kavşaklar

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

oysa benim

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

üzerinde alışveriş listeleri olan başka tablo Benim soru, bir kişi veya onların kimliğine göre, hangi mağazalara gidebileceklerini bulmanın en iyi yolu nedir? MySQL'de bu tür hesaplamalar için bir model var mı? Zaman ayırdığınız için

-- 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; 

Teşekkür: (çok çirkin ve pis)

girişimim gibi bir şey!

Düzenleme SQL Fiddle with Data

+2

sayesinde ancak üzerinde bir çalışma modeli oluşturduk eğer daha iyi olurdu [SQL Fiddle] (http://sqlfiddle.com/) – Taryn

+1

Böyle mi? http://sqlfiddle.com/#!2/83667/6 – KLee1

+0

Mükemmel, teşekkürler! :) – Taryn

cevap

3

Ben onların sütunu bağlayan dört tabloları katılmak olacak sorunu çözdü olsaydı HAVING Maddesine sonra alt sorgu (özellikle yabancı anahtarlar) öğe sayısını saymak için her kişi için listede. Bu, bir deneyin

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

Tüm işi yapabilmeniz için, alışveriş listelerini tek bir mağaza olarak karşılayabilecekleri kişileri seçerek, '@ IDIDID' göstergesine ihtiyaç duymadan mağazanın adıyla yapabileceksiniz. –

+0

@JonathanLeffler OP'ye sadece OP'nin ne istediğini soruyordum. Soruma göre, bir kişi ya da onların id'si…. Neyse, sadece cevabı güncelleyeceğim :) Teşekkürler. –

+0

Burada bir köşe var mı? Kişinin kendi listesinde hiçbir şey yoksa ne olur? Bu durumda herhangi bir mağazaya gidebilirler. Bu dava için bir if ifadesinin olması en iyisi olur mu? – KLee1

1

@JohnWoo ver: neden DISTINCT?

diğeri ... masa DDL/DML yazabilmek için

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] 
); 
İlgili konular