Mysql 按逗号拆分列,然后显示所有行中出现的所有值?
表: 输入将是一个项目id列表,如2、3、4,输出将是所有项目中找到的所有存储id。。。so:102104 另一个示例输入:1,2,输出:102 MySQL提供这样的操作吗 首先,我需要用输入选择行。然后,我可以将select变量中的所有store_ID放入1,并找到任何出现n次n为输入计数的store_ID 为什么我的问题不同 我不是在问一个分隔列表是好是坏,或是任何与之相关的意见。我在问,我如何使用它来获得结果 MySQL提供这样的操作吗 当然,如果我理解正确的话,您只需要选择每个商品的所有可能门店id,您可以通过一个简单的语句来实现这一点: 我没有找到您的数据库布局,因此您必须根据需要处理它:Mysql 按逗号拆分列,然后显示所有行中出现的所有值?,mysql,Mysql,表: 输入将是一个项目id列表,如2、3、4,输出将是所有项目中找到的所有存储id。。。so:102104 另一个示例输入:1,2,输出:102 MySQL提供这样的操作吗 首先,我需要用输入选择行。然后,我可以将select变量中的所有store_ID放入1,并找到任何出现n次n为输入计数的store_ID 为什么我的问题不同 我不是在问一个分隔列表是好是坏,或是任何与之相关的意见。我在问,我如何使用它来获得结果 MySQL提供这样的操作吗 当然,如果我理解正确的话,您只需要选择每个商品的所有
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 |
+----------+