我正在处理将一个表中的数据映射到CSV文件的大型查询,因此它基本上看起来像一个基本的选择查询 -
SELECT * FROM item_table
- 除了*
实际上是一百行CASE,IF,IFNULL和其他逻辑。
我被告知要在select语句中添加一个“相似项”行,该语句应该是逗号分隔的项目编号。类别项可在category_table中找到,可以在两个数据点column_a和column_b上连接到item_table,category_table.category_id包含标识类似项的数据。
此外,我被告知不要使用子查询。
所以我需要加入该表中具有相同category_id值的category_table和group_concat项目编号(但没有当前记录的项目编号)。
如果我只能使用子查询来执行它,无论指令如何,我都会接受,但是如果可能的话,我想按照指示使用join和group_concat来做 - 我只是想不出来。我怎么能这样做?
答案 0 :(得分:1)
我认为这是你正在寻找的,虽然我不确定你的item_table唯一标识是什么,所以我使用了column_a和column_b(这些可能不正确):
SELECT
...,
GROUP_CONCAT(c.category_id separator ',') CategoryIDs
FROM item_table i
JOIN category_table ct ON i.column_a = ct.column_a AND
i.column_b = ct.column_b
GROUP BY i.column_a, i.column_b
我使用了常规INNER JOIN
,但如果category_table可能没有任何相关记录,您可能需要使用LEFT JOIN
来获得所需的结果。
答案 1 :(得分:1)
您可以使用名为隐藏列的mySQL“功能”。
我将假设您在项目表中有一个唯一标识每一行的项目ID。而且,如果我的逻辑正确,则以下查询会执行您想要的操作:
select i.*, group_concat(c.category_id)
from item_table i left outer join
category_table c
on i.column_a = c.column_a and
i.column_b = c.column_b and
i.item_id <> c.category_id
group by i.item_id
答案 2 :(得分:1)
也许是这样的?
SELECT i.*, GROUP_CONCAT(c.category_id) AS similar_items
FROM item_table i
INNER JOIN category_table c ON (i.column_a = c.column_a AND
i.column_b = c.column_b)
GROUP BY i.column_a, i.column_b