使用带有IN(...)查询的父查询中的值进行子查询?

时间:2015-08-24 08:24:23

标签: mysql

好的,我有点失落......不确定这是不可能还是我错过了什么......

我在“发票”表格中有一个名为“产品”的列,其中包含以逗号分隔的产品ID列表(例如1,2,3),以及另一个名为“products”的表格,我正在尝试使用的SKU获取单个查询并以逗号分隔列表的形式提供,因此如果原始“products”列包含“1,2,3”作为条目,我希望在结果中有另一个“skus”列具有“DD093,RT883,KR933”等条目(与这些产品ID匹配的样本SKU)。

以下是我的工作正常(传递特定的产品ID列表):

SELECT i.*, (SELECT GROUP_CONCAT(sku) FROM products p WHERE p.id IN (1,2,3)) AS skus 
FROM invoices i
WHERE 1 
ORDER BY i.id DESC

并返回如下内容:

id | products | skus
1 | 1,2,3 | DD093,RT883,KR933

但如果我传递这样的话:

SELECT i.*, (SELECT GROUP_CONCAT(sku) FROM products p WHERE p.id IN (i.products)) AS skus 
FROM invoices i
WHERE 1 
ORDER BY i.id DESC

查询中断...

那么如何从像这样的子查询中获取i.products中的值?

甚至可能吗?

P.S。 - 在您建议我对数据进行规范化,或者判断我使用这样糟糕的设置之前,请记住它是故意的,因为为每个产品的“发票”表创建单独的记录会使更多的东西复杂化在前端,我不想也不需要去那里。这只是各种各样的日志,并且会使前端显示对于那一列更好,这就是为什么我试图在单个查询中完成它并询问它是否可能 - 如果是,如何?如果没有,我也想对此作出明确答复。

1 个答案:

答案 0 :(得分:1)

  

甚至可能吗?

也许,没有测试就很难说。你可以尝试类似的东西:

SELECT i.*, (
  SELECT GROUP_CONCAT(sku) FROM products p
  WHERE FIND_IN_SET(p.id, i.products) > 0
) AS skus 
FROM invoices i
WHERE 1 
ORDER BY i.id DESC