簡體   English   中英

如何使用MySQL左聯接兩個表並從子查詢的主查詢中排除多行?

[英]How to do LEFT JOIN two tables and exclude multiple rows from main query in subquery using MySQL?

我是php和MySQL的新手,並開始通過對自定義CMS進行編程來進行探索。

我有一個稱為新聞的表,其中包含許多新聞條目,這些條目由主鍵news_id自動遞增:

新聞(news_id,標題,字幕等)

我還有一個名為news_tags的表,其中包含由主鍵news_tag_id自動遞增的標簽標題:

news_tags(news_tag_id,news_tag_title)

因為每個新聞條目都可以標記有多個標簽標題,並且每個標簽標題都可以描述多個新聞條目,所以兩個表都是多對多關系。 因此,如果新聞條目被標記了,我會將它們的關系存儲在名為news_tags_relations的第三個表中,該表包含具有news_id和news_tag_id的行:

news_tags_relations(news_id,news_tag_id)

現在,我想為用戶提供選擇標簽的可能性,以便為新聞條目添加標簽,該新聞條目可能已經或可能沒有標簽。

因此,我需要選擇所有根本未鏈接到任何新聞條目的所有標簽標題及其標題ID,以及所有已鏈接到其他新聞條目但尚未為用戶正在處理的新聞條目選擇的所有標簽標題。

如果新聞條目的news_id僅鏈接到一個標簽,則效果很好:

SELECT news_tags.news_tag_title, news_tags_relations.news_id, news_tags.news_tag_id
FROM news_tags
LEFT JOIN news_tags_relations ON news_tags.news_tag_id = news_tags_relations.news_tag_id
WHERE news_tag_title != (

SELECT news_tag_title
FROM news_tags_relations
JOIN news_tags ON news_tags_relations.news_tag_id = news_tags.news_tag_id
WHERE news_tags_relations.news_id = '".$news_id."'
)

但是,如果選擇的news_id與兩個或多個標簽鏈接,則會得到:

1242-子查詢返回多於1行

這對我來說很有意義,因為鏈接到該news_id的標簽數量大於1,並且MySQL似乎無法處理返回多行的子查詢。

如果選擇的news_id未鏈接到任何標簽,則結果為空。 我試圖通過替換來解決

WHERE news_tag_title != (

WHERE news_tag_title IS NULL OR news_tag_title != (

並沒有將結果更改為0。

這是我能得到的最接近的。

如何修改查詢以使其適用於鏈接到多個標簽或根本沒有標簽的條目?

您可以重寫查詢而不使用子查詢,也可以在ON()子句中添加另一個條件

SELECT DISTINCT
nt.news_tag_title,
nt.news_tag_id
FROM 
news_tags nt
LEFT JOIN news_tags_relations ntr
ON nt.news_tag_id = ntr.news_tag_id
AND ntr.news_id !='".$news_id."'

上面的查詢將加入行news_tags_relations其中news_tag_idnews_tags等於news_tag_idnews_tags_relationsnews_idnews_tags_relations不等於當前的新聞ID你要分配標簽,因此你用左連接,因此所有的行會根據返回的一個到ON nt.news_tag_id = ntr.news_tag_id AND ntr.news_id !='".$news_id."'標准。注意,我尚未在整個結果集上使用WHERE過濾器,我在ON()子句,因此除已分配的標簽外,所有標簽都將返回

我終於解決了。 由於@PlantTheIdea子查詢的作品,其去除結果集中LEFT的所有行JOIN包含news_tag_titles已經分配給其他news_ids 對於“排除”這些行的標准是news_tag_title通過news_tag_title NOT IN子查詢檢測。 未分配給任何news_tag_title新聞條目會在結果集中出現,因為它們的news_idNULL並由WHERE news_tag_title IS NULL 最后,我必須添加GROUP BY news_tag_title ,以避免在當前'".$news_id."'未分配給任何news_tag_titles時出現重復的news_tag_titles結果'".$news_id."'

因此,有效的查詢是:

SELECT news_tags.news_tag_title, news_tags_relations.news_id, news_tags.news_tag_id FROM news_tags LEFT JOIN news_tags_relations ON news_tags.news_tag_id = news_tags_relations.news_tag_id WHERE news_tag_title IS NULL OR news_tag_title NOT IN ( SELECT news_tag_title FROM news_tags_relations JOIN news_tags ON news_tags_relations.news_tag_id = news_tags.news_tag_id WHERE news_tags_relations.news_id = '".$news_id."' ) GROUP BY news_tag_title

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM