php - 如何通过排除一组数组来获取 MySQL 表的前 N ​​条记录?

标签 php mysql performance records

这是一个表格示例:

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
  1. 如何将一组排除的类别作为 WHERE 语句传递?
  2. 如何按受欢迎程度升序/降序排列?
  3. 我是在选择具有正确类别类型的商品之前还是之后订购它(性能方面)?

我不在乎响应是否按受欢迎程度排序。这是我可以在客户端重做的事情。

我知道这是核心级别的东西,但有什么方法可以加快它的速度吗?毕竟是全表扫描!

最佳答案

您可以使用 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/

相关文章:

php - MySQL:外连接和 COUNT()

mysql - 如果在子查询中使用表,如何更新表

php - UTF-8贯穿始终

php - 是什么减轻了 PHP 服务器的负载 : SimpleXML or json_decode?

iPhone 奇怪的 CoreData 缓存性能问题

php - 使用 PHP 更新 mySQL 数据库中的密码

php - Cakephp多层次关系

php - Azure 上适用于 Magento 的 MySQL 应用程序内

c# - 正则表达式性能下降

php - 通过php脚本显示png图片