0

我们有一个包含大约 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

Products 表然后有 i, items from 安排在

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 个表,我对购物车、产品和类别感兴趣)。

提前致谢!

4

1 回答 1

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-然后更改所有出现的| 并将它们更改为逗号。然后它在生成的逗号分隔列表中查找与 id 连接的 i- 。然后再次对类别进行相同的连接以获得父类别的匹配。

于 2013-06-14T12:30:38.030 回答