2015-11-25 78 views
0

我有我希望只返回的記錄相匹配的LABEL_NAME「超級明星」,但它返回任何LABEL_NAME以下查詢:壞的MySQL查詢

SELECT `chart_rating` . * , SUM(chart_rating.rating_score) AS total_score, release.release_label 
FROM `chart_rating` 
INNER JOIN `release` ON `chart_rating`.`rating_release_id` = `release`.`id` 
WHERE MATCH (
release.release_label 
) 
AGAINST (
"Ultra Music" 
IN BOOLEAN MODE 
) 
GROUP BY `rating_release_id` 
ORDER BY `total_score` DESC 

我有幾乎相同的查詢release_artist其中工程完美。

這個查詢有什麼問題?

+1

你可能觸犯MySQL的'GROUP BY'寬容,一個很常見的問題的運行 - 這將是大多數其他RDBMS的錯誤,只包括一個一個在'GROUP BY'當列'SELECT'有許多--MySQL允許它,但結果往往是不確定的。將表格中的行樣本與您希望查詢返回的樣本一起發佈。 –

回答

0

默認情況下(如果沒有+也沒有 - 指定)這個詞是可選的,但包含的行它的評級更高。這模仿了MATCH()... AGAINST()沒有IN BOOLEAN MODE修飾符的行爲。

​​

+1

不錯的發現會很好,但如果你可以添加一個他應該如何修改相應的sql的例子。 – Thomas

+0

謝謝bluepinto,從來不知道這一點。 – Billy

0

您可以嘗試使用除REPLACEspace

然後加入+UltraMusic

SELECT `chart_rating` . * , SUM(chart_rating.rating_score) AS total_score, release.release_label 
    FROM `chart_rating` 
    INNER JOIN `release` ON `chart_rating`.`rating_release_id` = `release`.`id` 
    WHERE MATCH (
    REPLACE(release.release_label,' ','') 
    ) 
    AGAINST (
    "+UltraMusic" 
    IN BOOLEAN MODE 
    ) 
    GROUP BY `rating_release_id` 
    ORDER BY `total_score` DESC 

希望這有助於。

0

爲什麼不使用簡單的比較。

SELECT `chart_rating` . * , SUM(chart_rating.rating_score) AS total_score, release.release_label 
FROM `chart_rating` 
INNER JOIN `release` ON `chart_rating`.`rating_release_id` = `release`.`id` 
WHERE release.release_label = "Ultra Music" 
GROUP BY `rating_release_id` 
ORDER BY `total_score` DESC 

如果你真的需要全文搜索的where子句可能看起來像這樣:MATCH (release.release_label) AGAINST ("+Ultra +Music" IN BOOLEAN MODE)

+0

可能只有部分名稱使用,例如。 「超」而不是「超音樂」 – Billy