在此查询后我得到2500个字符串
`SELECT t1.type, t1.from_sale,t1.from_sent,t1.on_sent,t2.from_sale,t2.from_sent,t2.on_sent FROM
(SELECT
type,from_sale,from_sent,on_sent
FROM deliverability.delivery_money_repo
where add_time >= (CURDATE()-1) AND add_time < CURDATE()) t1,
(SELECT
from_sale,from_sent,on_sent
FROM deliverability.delivery_money_repo
where add_time >= CURDATE()) t2`
但它应该只有50.我做错了什么? 我想得到昨天和今天的数据。
答案 0 :(得分:3)
如果您需要获取昨天和今天的数据,您应该重新考虑您的情况。
我会用你的条件:
SELECT *
FROM deliverability.delivery_money_repo
WHERE
-- yesterday
(add_time >= (CURDATE()-1) AND add_time < CURDATE())
OR
-- or today
(add_time >= CURDATE())
或者简单地说:
SELECT *
FROM deliverability.delivery_money_repo
WHERE add_time >= (CURDATE()-1)
您提取2500行是因为您正在执行implicit join并且您将昨天的记录*乘以今天的记录。
如果单独执行两个子查询,并使用union,则将提取50条记录。
答案 1 :(得分:1)
告诉你这里发生了什么。 Mysql正在做你正在问的问题。让我举一个简单的例子:
你有两张桌子:
table1(id1,value1)
table2(id2,value2)
现在你告诉mysql从 table1 获取每一行以及 table2 中的每一行并加入它们。这称为隐含连接,因为您没有为数据库提供连接内容的提示。会发生什么,每一行table1都与table2 中的每一行连接在一起。您应该为连接添加ON条件,但是您没有这样做。所以基本上你的查询是
SELECT * FROM table1, table2
我建议你使用连接语法:
SELECT *
FROM table1
JOIN table2
这会将 table1 中的每一行与 table2 中的每一行组合在一起。这意味着你将得到3 * 3 = 9行。或者在50 * 50以上的例子中。
如果要将两个(或更多)表与条件组合,则应使用ON条件
SELECT *
FROM table1
JOIN table2 ON table1.id1=table2.id2
这将导致只有2个结果,因为只有id 2和3在两个表2中。
现在查询。首先摆脱子查询!你只是不需要它们(它们会对性能产生不良影响)。我想你想根据类型加入。如果没有,请更改查询。
`SELECT t1.type, t1.from_sale,t1.from_sent,t1.on_sent,t2.from_sale,t2.from_sent,t2.on_sent
FROM deliverability.delivery_money_repo t1
JOIN deliverability.delivery_money_repo t2
ON t2.type=t1.type AND t2.add_time >= CURDATE()
WHERE t1.add_time >= (CURDATE()-1) AND add_time < CURDATE()
请参阅ON条件,这使得t2从今天开始只有add_time(这里有点像where条件)并为连接提供条件,因此不要进行隐含连接。如果table1和table2的类型相同,数据库现在只会加入行。
答案 2 :(得分:0)
请勿在“FROM”子句中使用符号“,”枚举您要访问的数据表。
因为您甚至不知道数据库服务器在读取SQL指令中的“FROM”子句时将采取何种行为。
视图被认为是关系数据库理论中的一种临时数据表。
也许数据库会执行隐式连接。 也许数据库会将SQL指令视为错误。 也许......
因此,如果需要,请明确使用连接。
SQL指令中的两个子查询将在数据集计算中创建两个视图(2个临时数据表)。
这两个观点似乎是作为笛卡尔积的加入。 (或其他类型的连接操作。)
笛卡尔积包含两个数据表(或视图)之间的所有可能组合。 因此,如果您将包含N行的数据表本身作为笛卡尔积加入,那么结果集中的行数将为N * N.
例如,
T1:
C1 | C2
-------------
r1c1 | r1c2
r2c1 | r2c2
T2:
C1
-----
r1c1
r2c1
数据表T1和amp;的笛卡尔积。 T2将是:
T1.C1 | T1.C2 | T2.C1
---------------------------------------
T1.r1c1 | T1.r1c2 | T2.r1c1
T1.r1c1 | T1.r1c2 | T2.r2c1
T1.r2c1 | T1.r2c2 | T2.r1c1
T1.r2c1 | T1.r2c2 | T2.r2c1
因为我不知道您的要求是什么,所以我目前无法为您编写推荐的SQL指令。
如果有必要加入从两个子查询创建的两个视图,那么你可以尝试'内部连接','左外连接'或'右外连接',或'完整外连接'显眼。