我遇到了这个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个结果等...
答案 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
);