2017-07-28 69 views
0

我有一個表artefact_combosMySQL的:選擇組合中的項目所需的數量所擁有的所有組合

id name       points study_time 
3 Climate Priority Oven   13333 13333 

和另一artefact_combo_items指定項目,使所需的那些項目的數量artefact_combo

id  artefact_combo_id thing_id number 
138  3     809   2 
139  3     798   3 
141  3     583   1 

接着的的第三表user_thing

SELECT * 
FROM `user_thing` 
WHERE (thing_id =809 
OR thing_id =798 
OR thing_id =583) WHERE user_id=4 
LIMIT 0 , 30 

id  user_id thing_id 
3229 4  583   
17756 4  583   

因此,在這種情況下,用戶4具有> =所需的項目數583,但沒有其他需要的項目數,所以我期待和空的結果。如果結果是:

id  user_id thing_id 
3229 4  583   
156  4  583   
17756 4  789 
17856 4  789 
67756 4  789 
122323 4  809 
434  4  809 

我想要一個結果集,如:

id name       points study_time 
3 Climate Priority Oven   13333 13333 

我試圖構建一個MySQL查詢,將得到的artefact_combos列表:某一特定user_id具有所需數量artefact_combo_itemsartefact_combos

我最近的最後4小時嘗試是:

SELECT foo.thing_id, 
count(user_thing.id) 
FROM 
(SELECT 
    a.name, 
    c.id, 
    c.artefact_combo_id, 
    c.thing_id, 
    c.number 
FROM artefact_combo_items AS c 
    INNER JOIN user_thing AS b ON b.id = c.thing_id 
    INNER JOIN artefact_combos AS a ON a.id = c.artefact_combo_id 

ORDER BY a.name DESC) AS foo, user_thing WHERE user_thing.id = foo.thing_id 

我的道歉,如果這個問題太具體或嚴重解釋;我可能比我準備啃咬的還要多。任何想法,提示或教導將非常感激。謝謝!

+0

你似乎對第三表沒有主鍵,這可能使事情不相稱難以 – Strawberry

+1

查詢不符合您的架構。也許你可以使用這個網站http://sqlfiddle.com/創建一個最小的例子,並告訴我們,你期望得到什麼結果 –

+0

@Strawberry謝謝 - 我試圖改變這個問題,以更具體地說明我是什麼實際上面對。 –

回答

0

我會查詢沒有丟失物品組合用戶:

SELECT ac.* 
    , u.id user_id 
    FROM artefact_combos ac 
    JOIN (SELECT distinct user_id id 
      FROM user_thing 
     ) u 
    WHERE not exists(SELECT 1 
         FROM artefact_combo_items aci 
         LEFT JOIN (SELECT user_id 
             , thing_id 
             , count(1) cnt 
             FROM user_thing ut 
             GROUP BY user_id 
              , thing_id 
           ) ui 
          ON ui.thing_id = aci.thing_id 
         WHERE aci.artefact_combo_id = ac.id 
         AND ( ui.user_id is null 
          OR ( ui.user_id = u.id 
           and ui.cnt < aci.number 
           ) 
          ) 
       ) 
+0

嗨@Sal - 謝謝,這真的很棒,似乎正在得到我需要的東西。它比我希望運行查詢要慢,但是3000個組合項目,8000個組合項目和每個用戶大約7000個用戶項目,我不確定我的預期!再次感謝您幫助解決這個問題。 –