这是一个表格示例:
Table: websites
Domain | Category | Popularity
google.com | 0 | 13,430
yahoo.com | 0 | 1,094
facebook.com | 1 | 23,943
youtube.com | 2 | 17,320
imdb.com | 3 | 6,094
stackoverflow.com | 4 | 2,930
ebay.com | 5 | 5,748
yandex.com | 5 | 3,748
我想通过排除按受欢迎程度排序的类别 CE = [C1, C2, C3 ... Cn] 来返回前 N 个结果。
例如:
排除搜索引擎CE=[0]的TOP 3结果按热度排序为:
Domain | Category | Popularity
facebook.com | 1 | 23,943
youtube.com | 2 | 17,320
imdb.com | 3 | 6,094
排除除搜索引擎CE = [1, 2, 3, 4, 5]以外所有类别的TOP 3结果按热度排序为:
Domain | Category | Popularity
google.com | 0 | 13,430
yahoo.com | 0 | 1,094
让我们处理最后一个查询。
我希望它看起来像这样:
SELECT domain, category, popularity FROM (SELECT domain, category, popularity FROM websites WHERE category != [1, 2, 3, 4, 5] ORDER BY popularity) LIMIT 0, 3
- 如何将一组排除的类别作为 WHERE 语句传递?
- 如何按受欢迎程度升序/降序排列?
- 我是在选择具有正确类别类型的商品之前还是之后订购它(性能方面)?
我不在乎响应是否按受欢迎程度排序。这是我可以在客户端重做的事情。
我知道这是核心级别的东西,但有什么方法可以加快它的速度吗?毕竟是全表扫描!
最佳答案
您可以使用 LIMIT
子句来做到这一点,您所要做的就是确保您的 WHERE
子句过滤掉您不需要的类别。试试这个:
SELECT *
FROM myTable
WHERE category NOT IN(category, list)
ORDER BY popularity DESC
LIMIT 3;
传递列表的方法是找到一种方法来构建要过滤掉的类别的逗号分隔列表。有关 IN
运算符的更多信息,请参阅 this链接。
这是一个 SQL Fiddle显示您的示例案例的示例。
关于php - 如何通过排除一组数组来获取 MySQL 表的前 N 条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30399105/