我有一张表 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
如果这个问题过于具体或严重解释,我表示歉意;我可能已经咬过了比准备咀嚼更多的东西了。任何想法,提示或教导都将非常感激。谢谢!
答案 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
)
)
)