我有三张桌子
CATS
id name
------------------------------
1 category1
2 category2
3 category3
4 category4
PRODUCT
id name
------------------------------
1 product1
2 product2
ZW-CAT-PRODUCT
id_cats id_product
------------------------------
1 1
3 1
4 2
现在我想获得我的产品及其类别
product1 => category1,category3
product2 => category4
有没有办法用一个mysql查询获取这个数组(或对象或东西)? 我尝试了JOINS,但似乎这不是我需要的,或者?
目前我正在使用3个查询(我认为太多了)。
有什么建议吗?
另一方面,如果我想获得特定类别的所有产品怎么办? 这可以在一个查询中完成吗?
答案 0 :(得分:3)
您可以使用GROUP_CONCAT在结果中获取单独的列表。
SELECT p.*,
GROUP_CONCAT(c.name SEPARATOR ',') as cats
FROM PRODUCT p
LEFT JOIN ZW-CAT-PRODUCT l
ON l.id_product=p.id
LEFT JOIN CATS c
ON c.id=l.id_cats
GROUP BY p.id
所以基本上,这首先做一些连接来获取所有数据。如果您仅使用GROUP_CONCAT
替换c.name
行,您会看到每个product_id /类别对的一行。 GROUP BY
告诉它根据产品ID对结果进行分组,然后GROUP_CONCAT(c.name..)
告诉它采用组中出现的所有不同c.name
值(因此对于每个产品ID,因为您按产品ID进行分组)并使用,
作为分隔符将这些值连接成一个字符串。
因此,为了获得相同风格的每个类别的所有产品,它就像这样,
SELECT c.*,
GROUP_CONCAT(p.name SEPARATOR ',') as products
FROM CATS c
LEFT JOIN ZW-CAT-PRODUCT l
ON l.id_cats=c.id
LEFT JOIN PRODUCT p
ON p.id=l.id_product
GROUP BY c.id
编辑:要获取特定类别的产品行(根据评论中的要求),就是这样。
SELECT p.*
FROM PRODUCT p
LEFT JOIN ZW-CAT-PRODUCT l
ON l.id_product=p.id
LEFT JOIN CATS c
ON c.id=l.id_cats
WHERE c.name='xyz';
答案 1 :(得分:2)
如果您需要每个产品的逗号分隔类别列表,请查看MySQL的GROUP_CONCAT()
聚合函数:
SELECT p.*, GROUP_CONCAT(c.name) AS categories
FROM PRODUCT p
LEFT JOIN ZW-CAT-PRODUCT cp ON p.id = cp.id_product
LEFT JOIN CATS c ON cp.id_cats = c.id
GROUP BY p.id
获取特定类别的所有产品(按类别ID):
SELECT p.*
FROM PRODUCT p
INNER JOIN ZW-CAT-PRODUCT cp ON p.id = cp.id_product
WHERE cp.id_cats = 42
相同,但按类别名称:
SELECT p.*
FROM PRODUCT p
INNER JOIN ZW-CAT-PRODUCT cp ON p.id = cp.id_product
INNER JOIN CATS c ON cp.id_cats = c.id
WHERE c.name = 'category1'
答案 2 :(得分:1)
你可以适应所有3对1查询是的,但考虑有3个huges表,我宁愿一个接一个地处理它们,而不是一次性完成整个批量处理。 这需要更长时间,但(在我看来)更加数据友好。