我对这个 SQL 查询有疑问
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 个结果......
最佳答案
这个问题的解决方案有点冗长(除非其他人有更好的主意)但你可以使用 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 .
关于mysql - SQL,为列设置限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32770125/