我想编写一个查询,该查询返回包含我选择的项目的框列表,并按照我选择的内容显示它们。如果我选择Item1,Item2和Item3,我希望看到的结果是:
BoxA, 3 , Item1
BoxA, 3 , Item2
BoxA, 3 , Item3
BoxB, 2 , Item2
BoxB, 2 , Item3
这意味着BoxA有3个我选择的项目,项目是Item1,Item2,Item3。 我无法找到一种方法来进行单一查询。我所能做的就是(注意我使用id而不是项目名称,只是为了简单。添加项目名称很简单。):
SELECT b.name,count(*) cnt, ib.i_id
FROM boxes b, items_boxes ib
WHERE b.id=ib.b_id and ib.i_id in (1,2,3,4)
GROUP BY b.id
ORDER BY cnt DESC;
此查询返回Box名称及其中的项目计数,而项目(或i_id)只是第一个。 我如何获得我需要的东西?我应该选择两个吗?
sqlFiddle:example
答案 0 :(得分:1)
您需要将计数作为单独的子查询进行,并将其与结果相结合。
SELECT
b.name,
ibc.cnt,
ib.i_id
FROM
boxes b
INNER JOIN
items_boxes ib
ON b.id = ib.b_id
INNER JOIN
(
SELECT b_id, COUNT(*) cnt
FROM items_boxes
WHERE i_id IN (1,2,3,4)
GROUP BY b_id
)
ibc
ON b.id = ibc.b_id
WHERE
ib.i_id IN (1,2,3,4)
要考虑没有项目的方框,只需将INNER JOIN
转入LEFT JOIN
s。
编辑:
添加了上述代码的SQL Fiddle示例。 SQL名称在SQL Fiddle中略有不同,因此SQL已经在那里进行了修改以反映出来。