Mysql 按逗号拆分列,然后显示所有行中出现的所有值?

Mysql 按逗号拆分列,然后显示所有行中出现的所有值?,mysql,Mysql,表: 输入将是一个项目id列表,如2、3、4,输出将是所有项目中找到的所有存储id。。。so:102104 另一个示例输入:1,2,输出:102 MySQL提供这样的操作吗 首先,我需要用输入选择行。然后,我可以将select变量中的所有store_ID放入1,并找到任何出现n次n为输入计数的store_ID 为什么我的问题不同 我不是在问一个分隔列表是好是坏,或是任何与之相关的意见。我在问,我如何使用它来获得结果 MySQL提供这样的操作吗 当然,如果我理解正确的话,您只需要选择每个商品的所有

表:

输入将是一个项目id列表,如2、3、4,输出将是所有项目中找到的所有存储id。。。so:102104

另一个示例输入:1,2,输出:102

MySQL提供这样的操作吗

首先,我需要用输入选择行。然后,我可以将select变量中的所有store_ID放入1,并找到任何出现n次n为输入计数的store_ID

为什么我的问题不同

我不是在问一个分隔列表是好是坏,或是任何与之相关的意见。我在问,我如何使用它来获得结果

MySQL提供这样的操作吗

当然,如果我理解正确的话,您只需要选择每个商品的所有可能门店id,您可以通过一个简单的语句来实现这一点:

我没有找到您的数据库布局,因此您必须根据需要处理它:

SELECT 
    a.id, /* These id´s are your item_id´s */
    GROUP_CONCAT(b.store_id) as store_ids /* These line puts your store_ids into one output */
FROM item_id a
JOIN store_id b ON b.item_id = a.id 
GROUP BY item_id
此语句返回如下内容:

+------+-----------+ |项目|仓库|标识| +------+-----------+ | 1 | 120,210,330 | | 2 | 90,10,30 | | 3 | 70,120,90,330 | +------+-----------+


Greetz-Toxi

您基本上要求从通过查找N个item_-id找到的列表集中找到N个逗号分隔列表的交集

存储逗号分隔列表的方式确实让这变得更加困难

要解决这个难题,我可以想出一个办法:

创建一个包含每个门店标识的表

mysql> create table stores (store_id int primary key);

mysql> insert into stores values (101), (102), (103), (104);
现在,您可以将逗号分隔列表中的存储集转换为多行,这是基于将CSV与存储表中的单个值进行匹配

mysql> select * from mytable as t join stores as s on find_in_set(s.store_id, t.store_id)
  where item_id in (2,3,4);
+---------+-----------------+----------+
| item_id | store_id        | store_id |
+---------+-----------------+----------+
|       3 | 101,102,103,104 |      101 |
|       2 | 102,104         |      102 |
|       3 | 101,102,103,104 |      102 |
|       4 | 102,103,104     |      102 |
|       3 | 101,102,103,104 |      103 |
|       4 | 102,103,104     |      103 |
|       2 | 102,104         |      104 |
|       3 | 101,102,103,104 |      104 |
|       4 | 102,103,104     |      104 |
+---------+-----------------+----------+
然后按store_id对这些行进行分组。如果您正在搜索N个item_id,则计数为N的组是符合条件的组

mysql> select s.store_id, count(*) 
  from mytable as t join stores as s on find_in_set(s.store_id, t.store_id) 
  where item_id in (2,3,4) 
  group by s.store_id;
+----------+----------+
| store_id | count(*) |
+----------+----------+
|      101 |        1 |
|      102 |        3 |
|      103 |        2 |
|      104 |        3 |
+----------+----------+
通过使用HAVING子句,可以将组筛选为所需的组

问题不仅在于它需要另一个表来列出所有的store\u id,而且FIND\u IN\u SET函数效率低下,无法使用索引进行优化。它必须进行交叉连接,这意味着对于X个项目和Y个存储,它将对X个项目进行表扫描,对于每个项目,它将对Y个存储进行表扫描。当你得到更多的商店和物品时,性能会随着X*Y的增加而下降

这就是为什么当您真的需要执行与字符串中的单个id进行比较的查询时,存储以逗号分隔的id列表通常不是一个好主意

您应该有三张桌子:

一张桌子上的物品 一张供商店使用的桌子 一个表,枚举每对项和存储 例如:

mysql> create table store_has_item (item_id int, store_id int, primary key (item_id, store_id));
每对商品和商店填写一行:

mysql> insert into store_has_item
    -> select t.item_id, s.store_id from mytable as t join stores as s on find_in_set(s.store_id, t.store_id);
Query OK, 15 rows affected (0.02 sec)
Records: 15  Duplicates: 0  Warnings: 0
现在,您可以只查询这一个表中的N个项目,按存储\ u id分组,并返回计数为N的组:

mysql> select store_id from store_has_item where item_id in (2,3,4)
  group by store_id having count(*) = 3;
+----------+
| store_id |
+----------+
|      102 |
|      104 |
+----------+

确实不清楚您在问什么,但它似乎是一个糟糕的数据库design@nacho是否需要另一个示例输入和输出?@User既然您知道,为什么不按建议更改表设计?您说您不是在问分隔列表是否好…但它确实不好,如果建议是改变你的设计,那你就应该这么做。这样,人们就更容易帮助您使用已建立的技术来处理正确设计的数据库,而不是解决糟糕设计的问题。你之所以会遇到这个问题,首先是因为设计有缺陷。这就等于说,我不是在问在西班牙商店里使用法语是否好;我在问如何在西班牙商店里使用法语来购买我想要的东西。法语没有错,西班牙语也没有错;但为了达到最佳效果,不要在西班牙商店使用法语。
mysql> select store_id from store_has_item where item_id in (2,3,4)
  group by store_id having count(*) = 3;
+----------+
| store_id |
+----------+
|      102 |
|      104 |
+----------+