MySQL:选择拥有所需组合项数量的所有组合

时间:2017-07-28 18:22:38

标签: mysql

我有一张表 artefact_combos

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_items 对于 artefact_combos

我最近四小时的尝试是:

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

如果这个问题过于具体或严重解释,我表示歉意;我可能已经咬过了比准备咀嚼更多的东西了。任何想法,提示或教导都将非常感激。谢谢!

1 个答案:

答案 0 :(得分: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 
                                )
                            ) 
                  )