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

时间:2015-05-22 14:17:26

标签: 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个结果。

例如:

排除搜索引擎的TOP 3结果CE = [0]按受欢迎程度排序:

Domain            | Category | Popularity

facebook.com      | 1        | 23,943
youtube.com       | 2        | 17,320
imdb.com          | 3        | 6,094

通过排除除搜索引擎之外的所有类别的TOP 3结果CE = [1,2,3,4,5]按人气排序:

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. 我选择具有正确类别类别(性能明智)的那些之前或之后是否订购?
  4. 我不关心响应是否按顺序排序。这是我可以重做客户端。

    我知道这是核心级别的东西,但有没有办法加速它?毕竟是一张全桌扫描!

2 个答案:

答案 0 :(得分:3)

public static void GetIDEInstances()
        {
            instances = new List<object>();
            Hashtable runningStationInstances = new Hashtable();
            Hashtable runningObjects = GetROTContent();


            object expectedObj;
            //runningObjects["!{5EB461D8-71CD-4E78-A360-4CE788A93063}"].GetHashCode();
            IDictionaryEnumerator rotEnumerator = runningObjects.GetEnumerator();
            while (rotEnumerator.MoveNext())
            {
                string candidateName = (string)rotEnumerator.Key;
                if (string.Compare(candidateName,"!{CB6BFC97-F8E3-4fce-B68B-4D01485811A1}",true)==0)
                {

                    viParenting = (IHandleVIParentInfo)rotEnumerator.Value;


                }
            }
}

将为您提供3类最受欢迎的域名,分别为1,2,3,4或5类

select *
from websites
where Category in (1, 2, 3, 4, 5)
order by Popularity desc
limit 0,3;

将为您提供3个最不受欢迎的域名,这些域名不属于1,2,3,4或5类

答案 1 :(得分:3)

您可以使用LIMIT子句执行此操作,您只需确保WHERE子句过滤掉您不想要的类别。试试这个:

SELECT *
FROM myTable
WHERE category NOT IN(category, list)
ORDER BY popularity DESC
LIMIT 3;

您在列表中传递的方式是找到一种方法来构建要过滤掉的类别的逗号分隔列表。有关IN运算符的详细信息,请参阅this链接。

以下是SQL Fiddle示例,其中显示了您的示例案例。