mysql - SQL,为列设置限制?

标签 mysql sql limit

我对这个 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 @numTOP @numUNION 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/

相关文章:

php - 一行显示今天和一周前的数据。在mysql中可以吗?

sql - Oracle SQL - 识别顺序值范围

php - 计算给定月份的总值(value)

JavaFX - 限制 TextArea 行?

ios - 将应用程序限制为仅iPad 1

r - 如何将三角形添加到 R 中的 ggplot2 颜色条以指示超出范围的值?

Mysql从unixtime时间戳中选择日期范围给出了太多记录

php - 从非日期时间格式的字段中获取记录

php - MySQL 上的嵌套查询性能与多次调用的对比。 (PHP)

mysql - 在具有用户定义表类型的 SQL 中选择 DBNULL