我的数据库是:
# item_rel
id | item_ids
--------------------------
1 | 1,2,4,6,8,10
2 | 3,5,7
3 | 9,11,12
.. | ............
# items
id | name
--------------------------
1 | Lorem
2 | Ipsum
3 | Sed
4 | Amed
.. | ............
问题是选择带有一个查询的项目。我尝试了很多方法但没有运气。只有这一点才能达到预期的结果:
SELECT
items.*
FROM
items
WHERE
items.id IN (
SELECT
items_rel.ids
FROM
items_rel
WHERE
items_rel.ids LIKE "1" OR
items_rel.ids LIKE "1,%" OR
items_rel.ids LIKE "%,1" OR
items_rel.ids LIKE "%,1,%"
)
此查询仅返回一个项目。如何通过一个查询获取每个项目?
答案 0 :(得分:3)
有很多原因不将ID存储在以逗号分隔的列表中:
table
。
有时候,我们会被别人的,非常非常非常糟糕的决定所束缚。
MySQL抵消了称为find_in_set()
的变通办法:
SELECT i.*
FROM items i JOIN
items_rel ir
ON find_in_set(i.id, ir.ids) > 0;
但是,您应该努力修复数据模型,而不是使查询正常工作。 Wikipedia是一个起点。
答案 1 :(得分:1)
首先,如上所述,请重新设计桌子。 但是,如果做不到,那么完成这项工作的方法就是在查询中添加更多逗号- 即添加前导和尾部逗号来满足Where ... Like ...
SELECT
Rows_items.*
FROM
Rows_items
WHERE
Rows_items.id IN (
SELECT
Rows_item_rel.id
FROM
Rows_item_rel
WHERE
',' + Rows_item_rel.item_ids + ',' LIKE '%,' + '1' + ',%'
)
答案 2 :(得分:0)
这有点棘手,但并非不可能,也不是无知的迹象:
SET @ids = (SELECT ids FROM item_rel
WHERE ids LIKE '1' OR ids LIKE '1,%' OR ids LIKE '%,1' OR ids LIKE '%,1,%') ;
SET @ids = (SELECT IF (@ids IS NOT NULL,@ids,'99999999999999999999999')) ;
SET @q = CONCAT('SELECT * FROM items WHERE ID IN (', @ids,')') ;
PREPARE stmt FROM @q ;
EXECUTE stmt ;
“ 99999999999999999999999”必须是您数据库中从未找到的任何值。