Mysql SQL:如何从3个不同的表中按2个最后日期获取单元格?
我有3张表,上面有表中的ID: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 我想在一个函数中运行一个查询
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”变量?在子查询和外部查询中,这里的人做得很好。谢谢!这里的人走得很远。谢谢!