2016-07-16 63 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