2016-02-26 99 views
1

我想這個代碼phpmysqlMySQL查詢與內部聯接返回重複錄入

SELECT p.ID, p.post_title, p.post_name 
FROM `wp6p_popularpostsdata` AS pps 
    INNER JOIN `wp6p_posts` AS p ON pps.`postid`= p.`ID` 
WHERE p.post_type = "post" 
    AND pps.last_viewed > DATE_SUB(CURDATE(), INTERVAL 1 WEEK) 
ORDER BY pps.`pageviews` DESC 
LIMIT 4 

,並正確地給出了結果

1336Reading Between The Lines. reading-between-the-lines 
824 Benefits of Watching Anime benefits-of-watching-anime 
1427 The Day Goes By. life-goes-by 
1950 Click here if you want to be rich want-to-be-rich 

但是,當我在我的PHP文件中使用它,它返回

閱讀之間的線。在線之間閱讀。日子過去了。觀看動畫的好處

global $wpdb; 
$interval = "1 WEEK"; 
$now = current_time('mysql'); 
$top4 = $wpdb->get_results(
'SELECT p.ID, p.post_title, p.post_name 
FROM `' . $wpdb->prefix . 'popularpostssummary` AS pps 
    INNER JOIN `' . $wpdb->prefix . 'posts` AS p ON pps.`postid`= p.`ID` 
WHERE p.post_type = "post" 
    AND pps.last_viewed > DATE_SUB("' . $now . '", INTERVAL ' . $interval . ') 
ORDER BY pps.`pageviews` DESC 
LIMIT 4;', ARRAY_A 
); 
foreach($top4 AS $index => $row) { 
$class = ($index == (count($top4) - 1)) ? ' last' : ''; 
$url = get_permalink($row['ID']); 
echo '<li class="trendingPost'.$class.'">' . 
    '<a href="' . $url . '">'.$row['post_title'].'</a></li>'; 
} 

如何防止重複結果?

+0

不要忘記在查詢中包含'post_status =「發佈」'。同時檢查您的popularposts表中是否存在多個記錄 –

+0

謝謝,我可以使用兩個AND嗎? 等,其中p.post_type = 「POST」 AND p.post_status = 「發表」 和pps.last_viewed> DATE_SUB(CURDATE(),間隔1周) –

+0

是的,你可以結合的條件;我想你打的第一個限制是[max_allowed_pa​​cket](https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html);-) – VolkerK

回答

2

這是很有誘惑力的使用exists而不是join

SELECT p.ID, p.post_title, p.post_name 
FROM wp6p_posts p 
WHERE p.post_type = 'post' AND 
     EXISTS (SELECT 1 
       FROM wp6p_popularpostsdata pps 
       WHERE pps.postid = p.ID AND 
        pps.last_viewed > DATE_SUB(CURDATE(), INTERVAL 1 WEEK) 
      ); 

然而,這並不讓你通過pageviews訂購。相反,使用聚合:

SELECT p.ID, p.post_title, p.post_name 
FROM wp6p_popularpostsdata pps INNER JOIN 
    wp6p_posts p 
    ON pps.postid = p.`ID` 
WHERE p.post_type = 'post' AND 
     pps.last_viewed > DATE_SUB(CURDATE(), INTERVAL 1 WEEK) 
GROUP BY p.ID, p.post_title, p.post_name 
ORDER BY MAX(pps.pageviews) DESC 
LIMIT 4; 
+0

感謝您的答案,我已經發現原因是我在查詢中使用popularpostssummary而不是popularpostsdata –

+0

嗯,這真的讓我感興趣。鑑於JOIN與wp6p_posts子集的1:1關係,在此使用GROUP BY/MAX方法實際上更好嗎? (我認爲這是一個好處,因爲Gordon在sql方面比我好,所以這是一個「真正的問題」;-)) – VolkerK

+0

@VolkerK。 。 。如果加入真的是1-1,那麼OP將不會得到重複。 –