Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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查询,两个表,多个项_Mysql_Sql - Fatal编程技术网

Mysql 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

我希望通过扭曲从两个表中检索数据,我需要从第二个表中获取多个值(不同日期的价格)。下面的方法很好,但我不是一个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 
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
,虽然我通常是显式的,但这是隐含的。因为这对你来说是新的,所以我想加上那张便条。