2017-07-24 43 views
0

我有這兩個表在這裏排序方式IN子句中有更多的匹配值的行

  posts        tags 
[ id   title ]   [ pid   tag ] 
[ 1   X  ]   [ 1   php ] 
[ 2   Y  ]   [ 1   pdo ] 
[ 3   Z  ]   [ 2   php ] 
            [ 2   ajax ] 
            [ 3   pdo ] 

,我現在將此查詢有關這兩個表

$query = " 
SELECT a.title FROM posts a 
INNER JOIN tags b ON a.id = b.pid 
WHERE b.tag IN ($tags) 
"; 

如果

$tags = [php, pdo]; 

我期望獲得更匹配的$tags值的行因此訂單將是X->Y->Z

如果

$tags = [php, pdo, ajax]

我期望能獲得X->Y->Z過,但在這兩個查詢的順序是不是這樣的話,那是由名稱或標記字母更像是有序的,我怎樣才能得到它由最高匹配的行排序,如果可能的話,唯一的行只有所有匹配的值。

+0

'我希望能得到更匹配的值'你能解釋一下嗎? 「更匹配的價值」是什麼意思?比賽是一場比賽,它不能「匹配更多」......? – dognose

+0

@dognose喜歡如果我'$ tags = [php,pdo]',因爲'title = x'有2個匹配'php,pdo',我預計它是所有返回的行中的第一個,那麼'title = y'只有'pdo'匹配,與'title = z'相同,因爲兩個匹配行的數量相同,我期望它們是隨機的或者由其他東西排序的。 – Axon

回答

0

如果只是關於標籤的出現,您可以按數量進行分組和排序。

喜歡的東西(未經測試)

$query = " 
SELECT a.title, GROUP_CONCAT(b.tag) as tags, count(b.tag) AS relevance FROM posts a 
INNER JOIN tags b ON a.id = b.pid 
WHERE b.tag IN ($tags) 
GROUP BY a.id 
ORDER BY count(b.tag) DESC 
"; 

(爲了DESCASC,這取決於你將有最頂層)

但儘管如此,這隻會考慮 「真正」 的比賽中,像任何錯字「 pgp「而不是」php「會殺死搜索結果的質量。