保持从mysql返回的记录的唯一性



是否有一种快速的方法来确保您从MySQL JOIN查询返回的记录是唯一的?

下面的代码可能会两次返回相同的类别。它的类别ID应该是不同的!

SELECT 
   exp_categories.cat_name, exp_categories.cat_id, exp_categories.cat_url_title
  ,exp_category_posts.entry_id, exp_channel_titles.status 
FROM (exp_categories 
LEFT JOIN exp_category_posts 
       ON exp_categories.cat_id = exp_category_posts.cat_id) 
LEFT JOIN exp_channel_titles 
       ON exp_category_posts.entry_id = exp_channel_titles.entry_id 
WHERE exp_categories.group_id = 2 
  AND exp_category_posts.entry_id IS NOT NULL 
  AND exp_channel_titles.status = 'open' 
ORDER BY RAND() 
LIMIT 2

如果我知道你需要什么,你可以关闭你的查询:

GROUP BY exp_categories.cat_id
ORDER BY RAND() 
LIMIT 2

这里的问题是您正在连接一对多,因此您将看到与"many"表中记录数量一样多的行。如果您只希望每个类别返回一行,则需要只查询类别,或者决定要使用什么标准从exp_category_posts中选择单个值。

一个示例选项是查询类别中最近的帖子,并在该结果集上连接,而不是exp_category_posts。

    SELECT 
   exp_categories.cat_name, exp_categories.cat_id, exp_categories.cat_url_title
  ,exp_category_posts.entry_id, exp_channel_titles.status 
FROM (exp_categories 
LEFT JOIN exp_category_posts 
       ON exp_categories.cat_id = exp_category_posts.cat_id) 
LEFT JOIN exp_channel_titles 
       ON exp_category_posts.entry_id = exp_channel_titles.entry_id 
WHERE exp_categories.group_id = 2 
  AND exp_category_posts.entry_id IS NOT NULL 
  AND exp_channel_titles.status = 'open' 
  GROUP BY exp_categories.cat_id
ORDER BY RAND() 
LIMIT 2

edit:在GROUP BY子句中添加您想要区分的列将确保只返回1。另外,ORDER BY RAND()是非常不推荐的,参见:http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/

最新更新