2013-08-06 67 views
0

我有這個疑問與內查詢SQL操作

SELECT * 
FROM `posts` 
WHERE `language` IN (SELECT `possible_languages` FROM `users` WHERE user_id = ?); 

在表posts:語言可以是enar
在表userspossible_languages可以是'en''ar''en','ar'
當選擇的值是'en','ar'查詢不起作用
我希望它能夠選擇enar IN('en','ar')

+0

聽起來像是一個數據問題,你可以發表這兩個表的數據的例子嗎? – Damon

回答

3

您不能使用in這樣的列表。你可以用exists做到這一點:

SELECT p.* 
FROM `posts` p 
WHERE exists (select 1 
       from `users` u 
       where u.user_id = ? and find_in_set(p.language, u.possible_languages) 
      ) 

如果您在users(user_id, possible_languages)有一個索引這將是更有效的。

+0

'AND FIND_IN_SET(language,(SELECT possible_languages FROM users WHERE user_id =?))'這是工作查詢的靈感來自您的解決方案。謝謝 –

+0

如果每個user_id只有一個用戶記錄(即user_id是主鍵)。我真的不認爲用戶的索引(user_id,possible_languages)會產生很大的差異。 – noz

1

可能更有效的加入

SELECT posts.* 
FROM `posts`, `users` 
WHERE find_in_set(`language`,`possible_languages`) 
AND user_id = ? 

這種更有效的查詢卻可能是:

SELECT posts.* 
    FROM posts,users 
WHERE (language=possible_languages OR possible_languages='ar,en') 
    AND user_id=? 

語言假設值,並按照指定的possible_languages只。在這種情況下,帖子中的語言索引是有用的。