2014-01-21 63 views
0

我有一個問題,我真的不知道如何解決它。所以我有以下表格的多對多關係模型:'posts','tags','posts_to_tags'。 假設我想獲取所有標籤以's'和't'開頭的帖子。我使用以下查詢:sql select with tags like or regexp

SELECT DISTINCT o.id 
FROM posts o 
JOIN posts_to_tags ot ON o.id = ot.post_id 
JOIN tags t ON ot.tag_id = t.id 
WHERE t.name REGEXP '^s|^t' 
GROUP BY o.id 
HAVING COUNT(o.id) = 2 

這在大多數情況下可以正常工作,但並非總是如此。例如,如果有一個帖子具有以下標籤:smee,smooth,lala 即使沒有以't'開始的標籤(有2個標籤以's'開頭),查詢也會成功。這裏帖子也應該有一個以't'開始的標籤。 有沒有人有任何提示如何解決這個問題? 我希望我能明確地理解問題。

預先感謝您。

+0

您的意思是標籤應該包含*至少一個*匹配以*每個*字符開頭,對吧?所以'smee,tooth,lala'可以適合你的例子。 – tenub

+0

是的,就是這樣!當然,'s'和't'是可以測試的東西。 –

回答

0

您希望所有標籤以's'開頭,另一個以't'開頭的帖子。您需要更改having條款:

SELECT o.id 
FROM posts o 
JOIN posts_to_tags ot ON o.id = ot.post_id 
JOIN tags t ON ot.tag_id = t.id 
WHERE t.name REGEXP '^s|^t' 
GROUP BY o.id 
HAVING count(distinct left(t.name, 1)) = 2; 

而且,你不要當您使用group by需要select distinct

+0

謝謝戈登!它幾乎可以工作。 's'和't'只是一個例子。我用's'和's'嘗試過,但它不起作用。有任何想法嗎?並感謝/ distinct的groub。 –

+0

@IoannisPanteleakis。 。 。 ''s''和''s''不會工作,因爲它們是一樣的。你應該提供一個你正在使用的真實例子。 –

+0

@GorgonLinoff你是對的,在想了一會之後,我才意識到它甚至沒有什麼意義(雙'')。這是一個簡單的個人項目,實際上學習cakephp並試圖弄清楚事情是如何工作的。所以它看起來像你的解決方案。你能解釋一下這個獨特的left()在這裏工作嗎?如果REGEXP包含更多字符的條款,是否需要更改左側(t.name,...)部分?再次感謝你,真的很感激。 –