Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 SQL:如何从3个不同的表中按2个最后日期获取单元格?_Mysql_Sql - Fatal编程技术网

Mysql SQL:如何从3个不同的表中按2个最后日期获取单元格?

Mysql SQL:如何从3个不同的表中按2个最后日期获取单元格?,mysql,sql,Mysql,Sql,我有3张表,上面有表中的ID: product: prod_id* prod_name prod_a_id prod_b_id prod_user keywords: key_id** key_word key_prod* kay_country data: id dat_id** dat_date dat_rank_a dat_traffic_a dat_rank_b dat_traffic_b 我想在一个函数中运行一个查询

我有3张表,上面有表中的ID:

product:
prod_id*    prod_name   prod_a_id   prod_b_id   prod_user 

keywords:
key_id**    key_word    key_prod*   kay_country 

data: 
id  dat_id**    dat_date    dat_rank_a  dat_traffic_a   dat_rank_b  dat_traffic_b 
我想在一个函数中运行一个查询,该函数获取一个$key_id,该id输出所有这些列,但仅针对插入的key_id的“data”表中的最后2个datesdat_date,因此对于每个key_字,我的SQL查询中包含两个last date_date+所有其他变量:

所以。。。这就是我目前所拥有的。我也不知道怎么才能拿到MAX vars。我试着用不同的方式使用maxdat_date,但都不起作用

SELECT prod_id, prod_name, prod_a_id, prod_b_id, key_id, key_word, kay_country, dat_date, dat_rank_a, dat_rank_b, dat_traffic_a, dat_traffic_b
    FROM   keywords
        INNER JOIN data 
            ON keywords.key_id = data.dat_id
        INNER JOIN prods
            ON keywords.key_prod = prods.prod_id
是否有可能只使用一个查询就可以做到这一点

为IgorM编辑:

这是输出上的错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CTE AS ( SELECT *, ROW_NUMBER() OVER (' at line 1

WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY dat_id ORDER BY dat_date ASC) AS RowNo FROM data ) SELECT * FROM CTE INNER JOIN keywords ON keywords.key_id = CTE.dat_id INNER JOIN prods ON keywords.key_prod = prods.prod_id WHERE RowNo < 3

您可以使用以下查询:

select prod_id, prod_name, prod_a_id, prod_b_id, key_id, key_word, 
kay_country, dat_date, dat_rank_a, dat_rank_b, dat_traffic_a, dat_traffic_b
from keywords where dat_date in (
 SELECT MAX(dat_date) FROM keywords temp_1 
where temp_1.prod_id = keywords.prod_id
union all 
SELECT MAX(dat_date) FROM keywords
WHERE dat_date NOT IN (SELECT MAX(dat_date ) FROM keywords temp_2 where
temp_2.prod_id = keywords.prod_id)
 )

您可以使用以下查询:

select prod_id, prod_name, prod_a_id, prod_b_id, key_id, key_word, 
kay_country, dat_date, dat_rank_a, dat_rank_b, dat_traffic_a, dat_traffic_b
from keywords where dat_date in (
 SELECT MAX(dat_date) FROM keywords temp_1 
where temp_1.prod_id = keywords.prod_id
union all 
SELECT MAX(dat_date) FROM keywords
WHERE dat_date NOT IN (SELECT MAX(dat_date ) FROM keywords temp_2 where
temp_2.prod_id = keywords.prod_id)
 )
对于SQL

WITH CTE AS
    (
       SELECT *,
             ROW_NUMBER() OVER (PARTITION BY dat_id ORDER BY dat_date ASC) AS                   
       RowNo FROM data
    )
    SELECT *
    FROM CTE
    INNER JOIN keywords 
            ON keywords.key_id = CTE.dat_id
        INNER JOIN prods
            ON keywords.key_prod = prods.prod_id
    WHERE RowNo < 3
对于SQL

WITH CTE AS
    (
       SELECT *,
             ROW_NUMBER() OVER (PARTITION BY dat_id ORDER BY dat_date ASC) AS                   
       RowNo FROM data
    )
    SELECT *
    FROM CTE
    INNER JOIN keywords 
            ON keywords.key_id = CTE.dat_id
        INNER JOIN prods
            ON keywords.key_prod = prods.prod_id
    WHERE RowNo < 3

我认为窗口功能是最好的方式。在不太了解数据结构的情况下,您可以尝试对您试图限制的内容进行子查询,然后将其与数据的其余部分连接起来。然后在where子句中限制您向后拉的行

select  p.prod_id, p.prod_name, p.prod_a_id, p.prod_b_id, 
        t.key_id, t.key_word, t.kay_country, t.dat_date, 
        t.dat_rank_a, t.dat_rank_b, t.dat_traffic_a, t.dat_traffic_b

from 
      (
          select 
                    k.key_id, k.key_word, k.kay_country, d.dat_date, d.dat_rank_a, 
                    d.dat_rank_b, d.dat_traffic_a, d.dat_traffic_b,
                    row_number() over (partition by dat_id order by dat_date desc) as 'RowNum'
           from     keywords as k
                    inner join 
                    data as d on k.key_id = d.dat_id

        ) as t

        inner join 
        prods as p on t.key_prod = p.prod_id

where tmp.RowNum <=2

我认为窗口功能是最好的方式。在不太了解数据结构的情况下,您可以尝试对您试图限制的内容进行子查询,然后将其与数据的其余部分连接起来。然后在where子句中限制您向后拉的行

select  p.prod_id, p.prod_name, p.prod_a_id, p.prod_b_id, 
        t.key_id, t.key_word, t.kay_country, t.dat_date, 
        t.dat_rank_a, t.dat_rank_b, t.dat_traffic_a, t.dat_traffic_b

from 
      (
          select 
                    k.key_id, k.key_word, k.kay_country, d.dat_date, d.dat_rank_a, 
                    d.dat_rank_b, d.dat_traffic_a, d.dat_traffic_b,
                    row_number() over (partition by dat_id order by dat_date desc) as 'RowNum'
           from     keywords as k
                    inner join 
                    data as d on k.key_id = d.dat_id

        ) as t

        inner join 
        prods as p on t.key_prod = p.prod_id

where tmp.RowNum <=2

这是一个分组最大值问题。MySQL中不存在CTE

我不完全清楚您的表是如何链接的,但这里有一个提示:

SELECT
    *
FROM
  ( SELECT  @prev := '', @n := 0 ) init
JOIN
  ( SELECT  @n := if(k.key_id != @prev, 1, @n + 1) AS n,
            @prev := k.key_id,
            d.*, k.*, p.*
        FROM  data d
        JOIN  keywords k  ON k.key_id = d.dat_id
        JOIN  prods p     ON k.key_prod = p.prod_id
        ORDER BY
            k.key_id   ASC,
            d.dat_date ASC
  ) x
WHERE  n <= 2
ORDER BY  k.key_id, n;

这是一个分组最大值问题。MySQL中不存在CTE

我不完全清楚您的表是如何链接的,但这里有一个提示:

SELECT
    *
FROM
  ( SELECT  @prev := '', @n := 0 ) init
JOIN
  ( SELECT  @n := if(k.key_id != @prev, 1, @n + 1) AS n,
            @prev := k.key_id,
            d.*, k.*, p.*
        FROM  data d
        JOIN  keywords k  ON k.key_id = d.dat_id
        JOIN  prods p     ON k.key_prod = p.prod_id
        ORDER BY
            k.key_id   ASC,
            d.dat_date ASC
  ) x
WHERE  n <= 2
ORDER BY  k.key_id, n;

如果您一次只想为一个密钥id执行此操作,正如您在对其他答案的回答中提到的,并且只需要两行,您可以执行以下操作:

   SELECT p.prod_id,
          p.prod_name,
          p.prod_a_id,
          p.prod_b_id, 
          k.key_id, 
          k.key_word, 
          k.key_country, 
          d.dat_date, 
          d.dat_rank_a,
          d.dat_rank_b,
          d.dat_traffic_a,
          d.dat_traffic_b
     FROM keywords k
     JOIN data d
       ON k.key_id = d.dat_id
     JOIN prods p
       ON k.key_prod = p.prod_id
    WHERE k.key_id = :key_id /* Bind in key id */
 ORDER BY d.dat_date DESC
    LIMIT 2;
是否需要此选项取决于您的数据结构以及每个日期是否有多个键/产品组合

仅限制数据行的另一个选项是:

   SELECT p.prod_id,
          p.prod_name,
          p.prod_a_id,
          p.prod_b_id, 
          k.key_id, 
          k.key_word, 
          k.key_country, 
          d.dat_date, 
          d.dat_rank_a,
          d.dat_rank_b,
          d.dat_traffic_a,
          d.dat_traffic_b
     FROM keywords k
     JOIN (
       SELECT dat_id,
              dat_date,
              dat_rank_a,
              dat_rank_b,
              dat_traffic_a,
              dat_traffic_b
         FROM data
        WHERE dat_id = :key_id /* Bind in key id */
     ORDER BY dat_date DESC
        LIMIT 2
          ) d
       ON k.key_id = d.dat_id
     JOIN prods p
       ON k.key_prod = p.prod_id;

如果您想要所有关键字的某种分组结果,您需要查看其他答案。

如果您一次只想对一个关键字id执行此操作,正如您在对其他答案的回答中所提到的,并且只需要两行,您可以执行以下操作:

   SELECT p.prod_id,
          p.prod_name,
          p.prod_a_id,
          p.prod_b_id, 
          k.key_id, 
          k.key_word, 
          k.key_country, 
          d.dat_date, 
          d.dat_rank_a,
          d.dat_rank_b,
          d.dat_traffic_a,
          d.dat_traffic_b
     FROM keywords k
     JOIN data d
       ON k.key_id = d.dat_id
     JOIN prods p
       ON k.key_prod = p.prod_id
    WHERE k.key_id = :key_id /* Bind in key id */
 ORDER BY d.dat_date DESC
    LIMIT 2;
是否需要此选项取决于您的数据结构以及每个日期是否有多个键/产品组合

仅限制数据行的另一个选项是:

   SELECT p.prod_id,
          p.prod_name,
          p.prod_a_id,
          p.prod_b_id, 
          k.key_id, 
          k.key_word, 
          k.key_country, 
          d.dat_date, 
          d.dat_rank_a,
          d.dat_rank_b,
          d.dat_traffic_a,
          d.dat_traffic_b
     FROM keywords k
     JOIN (
       SELECT dat_id,
              dat_date,
              dat_rank_a,
              dat_rank_b,
              dat_traffic_a,
              dat_traffic_b
         FROM data
        WHERE dat_id = :key_id /* Bind in key id */
     ORDER BY dat_date DESC
        LIMIT 2
          ) d
       ON k.key_id = d.dat_id
     JOIN prods p
       ON k.key_prod = p.prod_id;

如果您想要所有关键字的某种分组结果,您需要查看其他答案。

请显示示例数据和所需结果。现在还不清楚您实际想做什么,因为您需要产品表中的信息,但您似乎在限制基于关键字表的结果。@RickSanchez,如果您在MySQL上运行它,它将无法工作,因为MySQL不支持。所以我需要知道你在处理什么样的数据库。请显示样本数据和期望的结果。现在还不清楚您实际想做什么,因为您需要产品表中的信息,但您似乎在限制基于关键字表的结果。@RickSanchez,如果您在MySQL上运行它,它将无法工作,因为MySQL不支持。所以我需要知道你在处理什么。我理解答案,但不理解投票结果。这个问题清楚地从“数据”表中为每个键id指定了最后2个日期datesdat_date,因此这不是一个正确的答案。这将导致总共两行,他希望每个id有两个日期,而不是总共两行。我理解答案,但不理解向上投票。问题清楚地从“数据”表中为每个键id指定了最后2个日期datesdat_date,因此这不是正确的答案。这将导致总共两行,他希望每个id有两个日期,而不是总共两行。CTE是命令吗?我应该研究什么?我将在几分钟后尝试这一点。@RickSanchez,CTE不是命令它一种临时表的名称,它填充了以下查询SELECT*,按dat\U id划分的行数,按dat\U date ASC排序,作为数据中的行号,所以我现在肯定有新的东西要研究了!:我得到了语法错误,我使用的是codeigniter,当我在文本编辑器中写下这些时,像SELECT这样的词不会得到特殊的颜色。这对我来说很奇怪。我将用整个函数更新我的主要帖子,并告诉我是否发现任何可疑错误。@RickSanchez,revisedSQL query:SET dat_id=;说明:文件1193-未知系统变量“dat_id”CTE是命令吗?我应该研究什么?我将在几分钟后尝试这一点。@RickSanchez,CTE不是命令它一种临时表的名称,它填充了以下查询SELECT*,按dat\U id划分的行数,按dat\U date ASC排序,作为数据中的行号,所以我现在肯定有新的东西要研究了!:我得到了语法错误,我使用的是codeigniter,当我在文本编辑器中写下这些时,像SELECT这样的词不会得到特殊的颜色。
这对我来说很奇怪。我将用整个函数更新我的主要帖子,并告诉我是否发现任何可疑错误。@RickSanchez,revisedSQL query:SET dat_id=;said:Documentation 1193-未知系统变量'dat_id'我在哪里插入'key_id'变量?我不理解您关于插入key_id的问题。或者可能我不理解原始问题。我在哪里插入'key_id'变量?我不理解您关于插入key_id的问题。或者可能我不理解原始问题问题。我在哪里插入“key\u id”变量?在子查询和外部查询中我在哪里插入“key\u id”变量?在子查询和外部查询中,这里的人做得很好。谢谢!这里的人走得很远。谢谢!