mysql - 使用通配符从列表中选择项目

标签 mysql sql select concatenation

我有一个 orders 表,其中包含与每个订单相关的许多 items:

id   | ... |  items
-----+-----+-----------------
34   | ... |  823, 27, 1657
678  | ... |  957
2548 | ... |  92, 823

Field orders.items 将内容存储为逗号分隔的 id 文本字段。 (我知道设计是错误的,应该有一个一对多的表来链接订单和项目,但我没有设计它)。

我需要根据订单包含的商品选择订单:

SELECT id, items FROM orders
WHERE items LIKE IN (
    SELECT CONCAT('%',id,'%') FROM items
    WHERE wishlist = 0

但显然它不起作用,因为我不能在从 IN 获得的项目列表中使用 LIKE。 然而,这正是我所需要的,因为我需要使用 % 通配符来找到它们。

我怎样才能做到这一点?

编辑:

在这个 SQL Fiddle 有一个我的代码示例返回 7 行并丢失其中的 2 行,其中 FIND_IN_LIST 函数对结果具有完全相同的效果。 p>

最佳答案

试试这个:

SELECT DISTINCT o.id, o.items 
FROM orders AS o
INNER JOIN items AS i ON FIND_IN_SET(i.id, REPLACE(o.items, ' ', ''))
WHERE i.wishlist = 0 AND i.cost = 44800;

检查这个SQL FIDDLE DEMO

输出

|  ID |      ITEMS |
|-----|------------|
| 154 |   375, 374 |
| 155 |        377 |
| 159 |        384 |
| 172 |        435 |
| 174 |        440 |
| 228 |   770, 769 |
| 229 |    775,841 |
| 230 |        777 |
| 528 | 1518, 1517 |

关于mysql - 使用通配符从列表中选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21231657/

相关文章:

php - 如何从时间函数中仅选择年份?

java - 流式传输 ResultSet 时,MySQL 是否使用服务器端预取

sql - 在 SQL 中的 2 个日期之间拆分数据

sql - 如何在SQL Server 20008R2中重写IS DISTINCT FROM和IS NOT DISTINCT FROM?

MySQL高效多表多索引选择

PHP MYSQL - 插入一条新记录,但需要另一个表中的 select 语句中的列 - 在 php 中失败

php - 代码点火器投票赞成

mysql - 如何从 mysql 数据库中获取数据并将其显示在 UITableView 中

从当年开始的 SQL 日期范围

mysql - SQL查询必须返回所有数据,而不仅仅是现有数据