Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从联接表中仅获取3行_Mysql_Sql - Fatal编程技术网

Mysql 从联接表中仅获取3行

Mysql 从联接表中仅获取3行,mysql,sql,Mysql,Sql,我试图从联接表中仅获取三行。 例如,我有一个categories表。我想在不使用SQL内部循环的情况下从这些类别中获得流行类别和3篇文章。职位总数应为12 我试过了,但没用。如果我设置限制1,它就可以工作。但不在限制3上工作 您的子查询返回多条记录,实际上是3,因此应将相等运算符替换为IN运算符 考虑: SELECT categories.name AS cname, categories.url AS curl, articles.name, article

我试图从联接表中仅获取三行。 例如,我有一个categories表。我想在不使用SQL内部循环的情况下从这些类别中获得流行类别和3篇文章。职位总数应为12

我试过了,但没用。如果我设置限制1,它就可以工作。但不在限制3上工作


您的子查询返回多条记录,实际上是3,因此应将相等运算符替换为IN运算符

考虑:

SELECT 
    categories.name AS cname,
    categories.url  AS curl,
    articles.name,
    articles.url,
    articles.image
FROM   
    categories
    JOIN articles ON articles.id IN (
        SELECT p.id
        FROM articles AS p
        WHERE categories.id = p.category AND p.delete = '0'
        ORDER  BY p.id DESC
        LIMIT  3
    )
WHERE  
    categories.delete = '0'
    AND categories.popular = '1'

在MySQL 8+中,您只需执行以下操作:

SELECT c.name AS cname, c.url  AS curl,
       a.name, a.url, a.image
FROM categories c JOIN
     (SELECT a.*,
             ROW_NUMBER() OVER (PARTITION BY a.category ORDER BY a.id DESC) as seqnum
      FROM articles a
      WHERE a.delete = 0
     ) a
     ON a.category = c.id
WHERE a.seqnum <= 3 AND
      c.delete = 0 AND
      c.popular = 1

将您的语法JOIN articles ON articles.id=替换为JOIN articles ON articles.id IN not worked for me:/可能重复我在phpmyadmin:1235中遇到的错误-此版本的MySQL尚不支持“LIMIT&IN/ALL/ANY/SOME subquery”@Cihan:您使用的是哪个版本的MySQL?
SELECT c.name AS cname, c.url  AS curl,
       a.name, a.url, a.image
FROM categories c JOIN
     (SELECT a.*,
             ROW_NUMBER() OVER (PARTITION BY a.category ORDER BY a.id DESC) as seqnum
      FROM articles a
      WHERE a.delete = 0
     ) a
     ON a.category = c.id
WHERE a.seqnum <= 3 AND
      c.delete = 0 AND
      c.popular = 1