2015-10-29 49 views
2

我試圖讓這個查詢MySQL的兼容:INTERSECT更換MySQL的

SELECT stories.*, 
    (SELECT id FROM models WHERE model_user_id = stories.user_id AND user_id = ? LIMIT 1) 
    AS c_model_id 
FROM stories 
WHERE 
    c_model_id IS NOT NULL 
    AND 
    EXISTS (
    SELECT tag_id FROM stories_tags WHERE story_id = stories.id 
    INTERSECT 
    SELECT tag_id FROM models_tags WHERE model_id = c_model_id 
) 

我下面根據this question嘗試。

SELECT 
    stories.*, 
    (SELECT id FROM models WHERE model_user_id = stories.user_id AND user_id = ? LIMIT 1) 
    AS c_model_id 
FROM stories 
WHERE 
    c_model_id IS NOT NULL 
    AND 
    EXISTS (SELECT t1.tag_id FROM (
    SELECT tag_id FROM stories_tags WHERE story_id = stories.id -- Here 
    UNION ALL 
    SELECT tag_id FROM models_tags WHERE model_id = c_model_id 
) AS t1 GROUP BY tag_id HAVING COUNT(*) >= 2) 

但是我遇到了一個新問題:我無法訪問從最深的子查詢的stories表:Unknown column 'stories.id' in 'where clause'

我無法找到任何解決這個問題,但可能有是一個,我只是沒有看到它。


編輯:

我發現一個MySQL兼容查詢:

SELECT stories.* 
FROM stories 
INNER JOIN models ON model_user_id = stories.user_id AND models.user_id = ? 
WHERE EXISTS 
(
SELECT stories_tags.tag_id 
FROM stories_tags 
LEFT JOIN models_tags 
ON models_tags.tag_id = stories_tags.tag_id 
WHERE models_tags.model_id = models.id AND story_id = stories.id 
) 

我認爲它等於第一個查詢。有人可以幫我驗證一下嗎?

+0

在'WHERE'子句中和'WHERE'子句中的子查詢中使用'c_model_id',是否引用SELECT'子句中的子查詢?如果是,那麼這也不起作用。 – fancyPants

+0

@fancyPants是的,他們打算提及相同的。其實我找到了一個替代查詢,可能你可以判斷它是否真的是替代品。 – idmean

回答

0

你的INTERSECT說:給我只有這兩個集合中存在匹配標籤的記錄。所以,你可以一樣好按標籤連接表,然後搜索:

SELECT 
    stories.*, 
    (SELECT id FROM models WHERE model_user_id = stories.user_id AND user_id = ? LIMIT 1) 
    AS c_model_id 
FROM stories 
WHERE EXISTS 
(
    SELECT * 
    FROM stories_tags st 
    JOIN models_tags mt ON mt.tag_id = st.tag_id 
    WHERE st.story_id = stories.id 
    AND mt.model_id = stories.c_model_id 
); 

我的方式,以匹配models_tags創紀錄的必須是真實的,無論如何去除WHERE c_model_id IS NOT NULL,對。

作爲兩家自己的建議:你的外連接(LEFT JOIN)無外連接可言,因爲你的WHERE子句中你說你只是想匹配(WHERE models_tags.model_id = models.id),從而打開連接成內連接。這看起來正是我所想到的:-)但是你也改變了你的SELECT子句。如果它存在,則不要選擇用戶模型條目,而是現在內部加入models表。因此,如果該記錄不存在,您現在不會收到任何數據。你可以通過外加models來代替:LEFT JOIN models。如果有多個匹配項,現在會得到重複的結果。然而,是否有可能不會從子查詢中得到一個我不知道的記錄。也許它不是,那麼你的查詢會正常工作。