MySQL查询:返回多个类别的同一字段上的多个连接 - 如何?

时间:2013-06-13 15:32:03

标签: mysql join

我们有一个大约有40000个id的表 - 其中一些ID是其他ID的父级(后来其中一些是不同表中其他ID的父级)。我想使用魔法,持久性和一些联接通过查询包含所有子ID(称为排列)的字段来确定哪些类别相关。

所以它的工作方式是分类表:

id       name               arrange
16       Alarms             c,119|c,117|c,4607|c,3366|c,709|c,4204|c,624|c,626|c,625|c,4203|c,4201|c,4202
119      Carbon Monoxide    i,21434|i,272|i,274|i,28451

产品表然后有i,项目来自

id       name
272      Aico EI205ENA
274      AICO EI225EN

基本上我正在对第三个订单表运行查询,并希望使用连接创建一个表,如下所示:

order date    id    name       id    name               id    name             quantity    price
13-06-2013    16    Alarms     119   Carbon Monoxide    272   Aico EI205ENA    2           10.00

目前我有:

 select * from cart c
 join prods p on p.id = c.item
 where order_status = ''
 and date_ordered != '0000-00-00'
 order by date_added desc;

简单连接我现在想要添加第一个示例中的类别,我如何查询数组以获得我想要的内容?

(如果它有助于我们有3个表格,我对购物车,产品和类别感兴趣)。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我现在已经意识到表格是如何结合在一起的。

您可以通过以下方式实现目标。这将是缓慢的,我把它放在这里的主要原因是显示它是多么令人讨厌和不可读,作为对数据库规范化的鼓励。

SELECT * 
FROM cart c
INNER JOIN prods p 
ON p.id = c.item
INNER JOIN Category z1
ON FIND_IN_SET(CONCAT('i-', p.id), REPLACE(REPLACE(z1.arrange, 'i,', 'i-'), '|', ',')) > 0
INNER JOIN Category z2
ON FIND_IN_SET(CONCAT('c-', z1.id), REPLACE(REPLACE(z2.arrange, 'c,', 'c-'), '|', ',')) > 0
WHERE order_status = ''
AND date_ordered != '0000-00-00'
ORDER BY date_added DESC

FIND_IN_SET是一个在逗号分隔列表中查找值的函数。这是在您的分隔列表中,更改 i,的所有实例并将其更改为 i - ,然后更改 | 的所有实例并更改他们逗号。然后,它会在结果以逗号分隔的列表中查找与连接的i-连接。然后再次对类别进行加入以获得父类别的匹配。