2016-07-16 30 views
0

我跑在MySQL/PHP以下的MySQL + PHP凡(序列号)只在列表工作第一号

SELECT * FROM `uc_posts` WHERE `postinguser` IN (SELECT `following` FROM `uc_users` WHERE `id` = 1) ORDER BY id DESC LIMIT 20 

following值是1,2

然而对于一些原因是它仅显示行,其中的postinguser1

要确认当我运行:

(SELECT `following` FROM `uc_users` WHERE `id` = 1) 

则返回单元格following与内容1,2

当我运行这有什么奇怪的是:

SELECT * FROM `uc_posts` WHERE `postinguser` IN (1,2) ORDER BY id DESC LIMIT 20 

它返回所需的结果与行既postinguser12

的列following的结构为varchar(255) utf8_general_ci

你能看到这里有什么问题吗?

谢谢。

+1

WHERE IN'完全匹配,它不会将结果解析为逗号分隔列表。 – Barmar

回答

1

您不应该将数字列表作为分隔列表存储在单个列中。 SQL有一个伟大的数据结构来存储列表;它被称为,而不是字符串列

在你的情况下,值'1,2'正是它的样子:单个字符串。它将匹配另一个有三个字符的字符串,一个,一个逗号和一个二。

有时,我们被其他人的糟糕的设计决定所困扰。如果是这样,你可以写的条件为:

SELECT p.* 
FROM `uc_posts` p 
WHERE EXISTS (SELECT 1 
       FROM `uc_users` 
       WHERE `id` = 1 AND find_in_set(postinguser, following) > 0 
      ) 
ORDER BY id DESC 
LIMIT 20; 

不过,我会鼓励你改变你的数据结构,所以你可以使用一个普通JOIN。当您使用适当的数据结构时性能会更好。

+0

这很好,谢谢!是的,我仍然在学习,我认为这可能与字符串元素有关,这就是为什么我发布了列的结构。下次会记住这一点。 – Ben