【问题标题】:CSV in Where Condition MysqlCSV 在 Where 条件 Mysql 中
【发布时间】:2012-12-28 18:31:21
【问题描述】:

我有两个这样的 MySQL 表:

表A

 [name]   |   [id]
---------------------
 Shirts      1, 10, 16, 18
 Pants       14, 11
 Skirts      19, 13, 15

表B

 [id]   |   [s_id]
---------------------
 ABC         1
 AC          1
 DE          10 
 DEC         19
 ACD         16
 BCD         18
 BCO         18

现在我需要从TableB 获取与s_id 匹配的ids,即来自idTableA 的任何给定名称。

查询如下所示:

 SELECT id 
   FROM TableB
  WHERE s_id IN ( SELECT id
                    FROM TableA
                   WHERE name = 'Shirts' )

所以子查询返回1, 10, 16, 18 (csv)。但我知道这不能在子查询中这样使用。

有什么想法吗?

【问题讨论】:

  • 您拥有的是一个非常糟糕的架构。由于我并不真正了解表中的那些 id 实际代表什么,因此我很难就如何修复架构给出答案。你能用现实世界的术语解释一下这些表代表什么,以便给出如何修复你的架构的建议吗?
  • 我了解架构状况不佳。但不幸的是,我无法更改架构,因为它是不久前开发的现有实时产品。
  • 问这些问题的人经常会说“我无法更改架构”,这总是让我感到惊讶。有时在软件开发中需要更改架构,尤其是在您尝试以前所未有的方式查询数据的情况下。
  • @MikeBrant 我明白你的意思:-)。我正在为现有软件开发 API,该软件已经开发了 5 年。它不是一个简单的产品。它有大量的文件和大量的表格。一个小的变化可以影响大。虽然我很想解决这个问题,但我做不到。 :-)

标签: mysql select csv where


【解决方案1】:

试试这个:

SELECT b.id, b.s_id
FROM TableB b 
INNER JOIN TableA a ON FIND_IN_SET(b.s_id, REPLACE(a.id, ' ', ''))
WHERE a.name = 'Shirts';

【讨论】:

  • 这有两个问题。首先是逗号分隔的值在逗号后面也有空格,这会混淆 FIND_IN_SET()。其次是 FIND_IN_SET() 返回集合中找到的值的索引,而不是值本身。试试看:select find_in_set('16', '1,10,16,18')
  • @SlipperyPete:第二个问题并不是真正的问题。如果 expr1 “在集合中找到”expr2,则返回值是一个正整数,在布尔上下文中计算为 TRUE。另一个大问题是性能。
  • @SlipperyPete 我们可以使用 REPLACE 关键字删除空格检查我更新的答案。第二个答案是我们要检查该字符串中是否存在 id 的天气,它将由 FIND_IN_SET 完成。
  • @SaharshShah 在这两个方面都是正确的,我只是得出了相同的结论。谢谢 -
  • 我想这将是一个巨大的性能猪。无论如何都会尝试这个。
【解决方案2】:

你可以试试这个。这个查询需要全表扫描,所以我希望你的表不是很大。

SELECT id
FROM TableB
WHERE FIND_IN_SET(s_id, (SELECT id FROM TableA WHERE name = 'Shirts')) IS NOT NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2015-06-16
    • 2012-06-02
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多