SQL,为列设置限制?

时间:2015-09-24 20:15:19

标签: mysql sql limit

我遇到了这个SQL-Query

的问题
SELECT * 
FROM page p 
LEFT JOIN categorylinks c ON p.page_id = c.cl_from 
WHERE c.cl_to IN
(
  'Art-Rock-Band',
  'Echo-Pop-Preisträger',
  'Englische_Band',
  'Genesis_(Band)',
  'Grammy-Preisträger',
  'Peter_Gabriel',
  'Phil_Collins',
  'Popband',
  'Progressive-Rock-Band',
  'Rock_and_Roll_Hall_of_Fame'
)

它有效,我得到p.page_id = c.cl_from

的每个页面的非常大的结果

现在我想为每个类别设置一个限制,因为查询需要的时间太长。

我只想为' Art-Rock-Band'提供5个结果,而对于' Echo-Pop-Preisträger'只需要5个结果等...

4 个答案:

答案 0 :(得分:1)

对此的解决方案有点冗长(除非其他人有更好的想法),但您可以使用UNION ALL显示遵循此模式的一系列较小查询的前5个结果:

SELECT * FROM page p
LEFT JOIN categorylinks c ON p.page_id = c.cl_from 
WHERE c.cl_to = 'Art-Rock-Band'
LIMIT 5
UNION ALL
SELECT * FROM page p
LEFT JOIN categorylinks c ON p.page_id = c.cl_from 
WHERE c.cl_to = 'Echo-Pop-Preisträger'
LIMIT 5
...

你也可以使用变量来取代它,并用一个变量替换5,这样你就可以通过一个简单的改变控制从一切中得到的结果:

DECLARE @num INT DEFAULT 5;

SELECT * FROM page p
LEFT JOIN categorylinks c ON p.page_id = c.cl_from 
WHERE c.cl_to = 'Art-Rock-Band'
LIMIT @num
UNION ALL
SELECT * FROM page p
LEFT JOIN categorylinks c ON p.page_id = c.cl_from 
WHERE c.cl_to = 'Echo-Pop-Preisträger'
LIMIT @num
...

作为一个附加值,我在实例中输入了第二个声明(当然已注释掉),您可能想要按百分比而不是设定数字来回忆。

我希望这至少可以帮助你指明正确的方向。

-C§

编辑:对于SQL Server,在每个查询中LIMIT @num之前将TOP @num替换为UNION ALL,并将DEFAULT替换为=。您还可以使用第二行将@num声明为字符串并使用PERCENT关键字,但仅在SQL Server中,因为MySQL和Oracle都不支持它。

对于Oracle,您可以通过添加WHERE子句来替换它:AND ROWNUM <= @num。您还希望更新DECLARE语句以将冒号前置为等号,以使=变为:=

这应该说明上述MySQL示例与其他两种格式中存在类似问题的后续问题的主要区别。可以在此处找到更多解释:http://www.w3schools.com/sql/sql_top.asp

答案 1 :(得分:0)

var controller = require('../controllers/UserController.js');
controller.myFunction( );

编辑:我发现此链接Get top n records for each group of grouped results,解决方案与@CSS

类似

答案 2 :(得分:0)

这是最快的方法,使用联合在每个类别上排名前5,并使用它来选择您的数据。如果您有良好的索引,此方法将更快地工作。你想要它们在page_id,cl_from和cl_to。

另请注意,在进行联合之前,我首先只选择page_id - 这样可以让sql server优化性能。

SELECT * 
FROM page p 
join 
(
   select p.page_id 
   from page p 
   left join categorylinks c ON p.page_id = c.cl_from 
   where c.cl_to = 'Art-Rock-Band'
   limit 5

   union

   select p.page_id 
   from page p 
   left join categorylinks c ON p.page_id = c.cl_from 
   where c.cl_to = 'Echo-Pop-Preisträger'
   limit 5

   union 

   select p.page_id 
   from page p 
   left join categorylinks c ON p.page_id = c.cl_from 
   where c.cl_to = 'Englische_Band'
   limit 5

   union 

   ...

   select p.page_id 
   from page p 
   left join categorylinks c ON p.page_id = c.cl_from 
   where c.cl_to = 'Rock_and_Roll_Hall_of_Fame'
   limit 5
) sub on sub.page_id = p.page_id

答案 3 :(得分:0)

这适合你吗?

SELECT *
FROM page p
WHERE p.page_id IN (
    SELECT c.cl_from
    FROM categorylinks
    WHERE c.cl_from = p.page_id
    AND c.cl_to IN (
        'Art-Rock-Band',
        'Echo-Pop-Preisträger',
        'Englische_Band',
        'Genesis_(Band)',
        'Grammy-Preisträger',
        'Peter_Gabriel',
        'Phil_Collins',
        'Popband',
        'Progressive-Rock-Band',
        'Rock_and_Roll_Hall_of_Fame'
    )
    LIMIT 5
);