Mysql SQL查询,两个表,多个项
我希望通过扭曲从两个表中检索数据,我需要从第二个表中获取多个值(不同日期的价格)。下面的方法很好,但我不是一个SQL的骑师,我暗自怀疑一定有比两次加入第二个表更好的方法。有吗Mysql SQL查询,两个表,多个项,mysql,sql,Mysql,Sql,我希望通过扭曲从两个表中检索数据,我需要从第二个表中获取多个值(不同日期的价格)。下面的方法很好,但我不是一个SQL的骑师,我暗自怀疑一定有比两次加入第二个表更好的方法。有吗 SELECT A.date, A.symbol, A.Value, B.close, C.close FROM Potential A LEFT JOIN Stock_Daily B ON A.symbol = B.symbol LEFT JOIN Stock_Daily C ON A.symbol = C.symbol
SELECT A.date, A.symbol, A.Value, B.close, C.close
FROM Potential A
LEFT JOIN Stock_Daily B ON A.symbol = B.symbol
LEFT JOIN Stock_Daily C ON A.symbol = C.symbol
WHERE A.Date = "2015-08-05" AND B.date = "2015-08-05" AND C.date = "2015-08-04"
ORDER BY value DESC LIMIT 20;
提前谢谢 在
B
和C
上使用不同条件的这种双重连接很好。使用子查询使查询更易于阅读可能更优雅一些:
SELECT A.date, A.symbol, A.Value, B.close, C.close
FROM Potential A
LEFT JOIN (SELECT close, date
FROM Stock_Daily
WHERE date = "2015-08-05") B ON A.symbol = B.symbol
LEFT JOIN (SELECT close, date
FROM Stock_Daily
WHERE date = "2015-08-05") C ON A.symbol = C.symbol
WHERE A.Date = "2015-08-05"
ORDER BY value DESC LIMIT 20;
但归根结底,这只是品味的问题-您的查询很好。在
B
和C
上使用不同条件的双重连接很好。使用子查询使查询更易于阅读可能更优雅一些:
SELECT A.date, A.symbol, A.Value, B.close, C.close
FROM Potential A
LEFT JOIN (SELECT close, date
FROM Stock_Daily
WHERE date = "2015-08-05") B ON A.symbol = B.symbol
LEFT JOIN (SELECT close, date
FROM Stock_Daily
WHERE date = "2015-08-05") C ON A.symbol = C.symbol
WHERE A.Date = "2015-08-05"
ORDER BY value DESC LIMIT 20;
但归根结底,这只是一个品味的问题——你的查询很好。用你现在的方式来做是很好的,但要在评论上进一步展开,你的查询可能存在一个问题。由于您使用连接表的
WHERE
子句中的条件逻辑执行左连接
,因此它有效地将左连接
转换为内部连接
如果右表中缺少任何日期而不满足内部联接
,则会给出不正确的结果
我建议将查询更改为以下内容以避免此情况:
SELECT A.date, A.symbol, A.Value, B.close, C.close
FROM Potential A
LEFT JOIN Stock_Daily B ON A.symbol = B.symbol AND B.date = "2015-08-05"
LEFT JOIN Stock_Daily C ON A.symbol = C.symbol AND C.date = "2015-08-04"
WHERE A.Date = "2015-08-05"
ORDER BY value DESC LIMIT 20;
按照您现在的方式进行操作是完全可以的,但是要进一步扩展注释,您的查询存在一个潜在的问题。由于您使用连接表的
WHERE
子句中的条件逻辑执行左连接
,因此它有效地将左连接
转换为内部连接
如果右表中缺少任何日期而不满足内部联接
,则会给出不正确的结果
我建议将查询更改为以下内容以避免此情况:
SELECT A.date, A.symbol, A.Value, B.close, C.close
FROM Potential A
LEFT JOIN Stock_Daily B ON A.symbol = B.symbol AND B.date = "2015-08-05"
LEFT JOIN Stock_Daily C ON A.symbol = C.symbol AND C.date = "2015-08-04"
WHERE A.Date = "2015-08-05"
ORDER BY value DESC LIMIT 20;
您可以使用
大小写
表达式和分组方式
处理旋转:
SELECT
p.date, p.symbol,
min(p.value) value, /* dummy aggregate */
min(CASE WHEN s.Date = p.Date THEN s.close END) Close1,
min(CASE WHEN s.Date = DATE_ADD(p.Date, INTERVAL 1 DAY THEN s.close END) Close2
FROM
Potential p
LEFT OUTER JOIN Stock_Daily s
ON s.symbol = p.symbol AND
(s.date = p.date or s.date = DATE_ADD(p.date, INTERVAL 1 DAY))
GROUP BY p.date, p.symbol
ORDER BY value DESC LIMIT 20;
您可以使用
大小写
表达式和分组方式
处理旋转:
SELECT
p.date, p.symbol,
min(p.value) value, /* dummy aggregate */
min(CASE WHEN s.Date = p.Date THEN s.close END) Close1,
min(CASE WHEN s.Date = DATE_ADD(p.Date, INTERVAL 1 DAY THEN s.close END) Close2
FROM
Potential p
LEFT OUTER JOIN Stock_Daily s
ON s.symbol = p.symbol AND
(s.date = p.date or s.date = DATE_ADD(p.date, INTERVAL 1 DAY))
GROUP BY p.date, p.symbol
ORDER BY value DESC LIMIT 20;
那么:MySQL还是Microsoft SQL Server?在一行中加入两个get值是获取多个不同值的正确方法。@kittykittybangbang MySQL您确定这可以正常工作吗?SQL语句中存在一个潜在的问题-由于
WHERE
子句中的所有条件逻辑,您正在将左连接
转换为内部连接
,这可能会导致不正确的结果。如果你真的想要一个左连接
,请将和B.date=“2015-08-05”和C.date=“2015-08-04”
位移动到它们各自的子句上。我正在使用MySQL,但标签专家建议添加sql server,我就是这样做的。很抱歉造成混淆。那么:MySQL还是Microsoft SQL Server?在一行中加入两个get值正是获取多个不同值的正确方法。@kittykittybangbang MySQL您确定这可以正常工作吗?SQL语句中存在一个潜在的问题-由于WHERE
子句中的所有条件逻辑,您正在将左连接
转换为内部连接
,这可能会导致不正确的结果。如果你真的想要一个左连接
,请将和B.date=“2015-08-05”和C.date=“2015-08-04”
位移动到它们各自的子句上。我正在使用MySQL,但标签专家建议添加sql server,我就是这样做的。很抱歉给你带来困惑。依我看,这其实很难理解……但正如你所说,这是一个品味的问题。我不认为这更难。好处是它更“模块化”。在我看来,这实际上更难阅读……但正如你所说,这是一个品味的问题。我不认为这更难。好处是它更“模块化”。我认为这应该是公认的答案,因为它是最简单和最直接的。然而,我从@Mureinik提供的答案中学到了很多,如果我的信用度足够高,我会投赞成票。我认为这应该是公认的答案,因为这是最简单、最直接的答案。然而,我从@Mureinik提供的答案中学到了很多,如果我的cred足够高的话,我会投赞成票。我不知道SQL查询中的CASE语句。谢谢,这将非常有用。我省略了ELSE null
,虽然我通常是显式的,但这是隐含的。因为它对您来说是新的,所以我想添加这个注释。我不知道SQL查询中的CASE语句。谢谢,这将非常有用。我省略了ELSE null
,虽然我通常是显式的,但这是隐含的。因为这对你来说是新的,所以我想加上那张便条。