查询结果不正确

时间:2017-01-25 08:01:14

标签: mysql sql join

在此查询后我得到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.我做错了什么? 我想得到昨天和今天的数据。

data

structure

3 个答案:

答案 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)

  • 1,a
  • 2,b
  • 3,c

table2(id2,value2)

  • 2,x
  • 3,y
  • 4,z

现在你告诉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指令。

如果有必要加入从两个子查询创建的两个视图,那么你可以尝试'内部连接','左外连接'或'右外连接',或'完整外连接'显眼。