選擇我有三個獨立的表 - pages
,tags
,並pages_tagged
- 包含頁面內容,標籤名稱和IDS,並頁IDS與標籤ID分別。磕磕絆絆與加盟,並從單獨的表
我試圖建立一個MySQL查詢需要的搜索項,檢查現有的標籤,找到匹配的標籤ID,並返回與所述標籤的所有網頁 - 我這有運作良好。但是,當我試圖進一步擴展它以查詢頁表的標題列中的匹配字符串時,事情有點過度了。
我的SQL如下:
SELECT tags.id, pages_tagged.page_id, pages.id, pages.randomId, pages.title,
DATE_FORMAT(pages.dateAdded, '%M %e, %Y') AS dateAdded,
pages.viewcount, pages.sessionId
FROM tags JOIN pages_tagged ON tags.id = pages_tagged.tag_id
JOIN pages ON pages_tagged.page_id = pages.randomId
WHERE (tags.tag = 'ovechkin' OR pages.title LIKE '%ovechkin%')
ORDER BY dateAdded DESC
我知道這裏的操作順序是非常錯誤的,但我不能換我的頭周圍正確的方法來修改這個查詢,使之正常工作。
會有人能夠指出我的明顯的錯誤?
編輯:
爲了澄清「肚了,」當運行查詢,它的「成功」。但是,不會返回任何行。
修改WHERE子句如下隔離pages.title LIKE「%奧韋奇金%」從未導致返回的行,不管搜索詞是什麼。
WHERE (pages.title LIKE '%ovechkin%')
編輯2:
樣品下面的數據。
pages
╔════╦════════════════════════╦═════════════════════╦══════════╦═══════════╗
║ id ║ title ║ dateAdded ║ randomId ║ viewcount ║
╠════╬════════════════════════╬═════════════════════╬══════════╬═══════════╣
║ 57 ║ Ovechkin looping about ║ 2013-04-07 19:26:06 ║ xp3rvju ║ 5 ║
╚════╩════════════════════════╩═════════════════════╩══════════╩═══════════╝
tags
╔════════╦══════════╗
║ id ║ tag ║
╠════════╬══════════╣
║ 25 ║ ovechkin ║
╚════════╩══════════╝
pages_tagged
╔══════════════════╗
║ tag_id | page_id ║
╠══════════════════╣
║ 25 | xp3rvju ║
║ 25 | mpbjbk6 ║
╚══════════════════╝
編輯3:
作爲建議,一個RIGHT JOIN
得到pages.title
工作。修改後的查詢是:
SELECT tags.id, pages_tagged.page_id, pages.id, pages.randomId, pages.title,
DATE_FORMAT(pages.dateAdded, '%M %e, %Y') AS dateAdded,
pages.viewcount, pages.sessionId
FROM tags RIGHT JOIN pages_tagged ON tags.id = pages_tagged.tag_id
RIGHT JOIN pages ON pages_tagged.page_id = pages.randomId
WHERE (tags.tag = 'ovechkin' OR pages.title LIKE '%ovechkin%')
ORDER BY dateAdded DESC
還有一個問題是,如果頁面在其標題和相關標籤中都有相同的搜索詞,它將返回兩次。我試圖修改它以包括在選擇DISTINCT
,如下,但這並不會對返回行的影響。
SELECT DISTINCT tags.id, pages_tagged.page_id, pages.id, pages.randomId, pages.title,
DATE_FORMAT(pages.dateAdded, '%M %e, %Y') AS dateAdded,
編輯4:
不妨包含最終溶液,以防止重複 - GROUP BY
。
SELECT tags.id, pages_tagged.page_id, pages.id, pages.randomId, pages.title,
DATE_FORMAT(pages.dateAdded, '%M %e, %Y') AS dateAdded,
pages.viewcount, pages.sessionId
FROM pages
LEFT JOIN pages_tagged ON pages.randomId = pages_tagged.page_id
LEFT JOIN tags ON tags.id = pages_tagged.tag_id
WHERE (tags.tag = 'ovechkin' OR pages.title LIKE '%ovechkin%')
GROUP BY pages.randomId
ORDER BY dateAdded DESC
你能解釋一下「事情有點過度了嗎」 - 你看到的結果與你期望看到的結果相反嗎? (FWIW,現有的查詢看起來OK。) – 2013-04-08 15:13:45
當然! 查詢運行「成功」,但沒有結果實際返回。移除tags.tag ='thang'沒有任何影響,但無論pages.title LIKE'%term%'下面的搜索字詞是什麼,都不會返回任何行。 – kaput 2013-04-08 15:17:37
你可以發佈一些相關的樣本數據嗎? – 2013-04-08 15:19:15