【问题标题】:Mysql three table join results empty setmysql三表连接结果空集
【发布时间】:2014-01-18 17:47:33
【问题描述】:

您好,我已经加入了三个表,但即使假设有一些结果,它也会返回空结果。这是我的sql

SELECT c.code,c.name, a.ltp as begning, b.ltp as enddate, d.interim_cash,d.interim_rec_date,
CAST(((b.ltp - a.ltp) / a.ltp * 100) AS DECIMAL(10, 2)) as chng
FROM eod_stock a
JOIN eod_stock b ON a.company_id = b.company_id
LEFT OUTER JOIN company AS c
ON c.ID = a.company_id
RIGHT JOIN divident_info AS d
ON c.ID = d.company_id
WHERE a.entry_date = "2012-09-24"
AND b.entry_date = "2012-09-25"
AND d.interim_rec_date BETWEEN "2012-09-24" AND "2012-09-25"
AND a.company_id IN (13, 2)
AND d.company_id IN (13,2);

我期待的结果是这样的:

+--------+-----------------+---------+--------+--------+------------------+------------+
| code   | name            | begning | end    | chng   | interim_rec_date |interim_cash|
+--------+-----------------+---------+--------+--------+------------------+------------+
| ABBANK | AB BANK LIMITED |  518.00 | 459.00 | -11.39 |2012-09-24        |10          |
| 1STICB | 1ST ICB M.F.    |  227.00 | 253.00 |  11.45 |                  |            |
+--------+-----------------+---------+--------+--------+------------------+------------+

但是我的结果是空的,这是因为第二个临时信息是 0 吗?如果行为空,我如何获取上面的所有信息,那么它可能是空白的,但我需要其他相关信息。

这是我的表架构:

eod_stock:

+-----------------+------------------+------+-----+---------+-------+
| Field           | Type             | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------+-------+
| company_id      | varchar(30)      | NO   | PRI | NULL    |       |
| entry_date      | date             | NO   | PRI | NULL    |       |
| entry_timestamp | int(10) unsigned | NO   |     | NULL    |       |
| open            | decimal(16,2)    | NO   |     | NULL    |       |
| high            | decimal(16,2)    | NO   |     | NULL    |       |
| low             | decimal(16,2)    | NO   |     | NULL    |       |
| ltp             | decimal(16,2)    | NO   |     | NULL    |       |
| ycp             | decimal(16,2)    | NO   |     | NULL    |       |
| cse_price       | decimal(9,2)     | NO   |     | NULL    |       |
| cse_volume      | decimal(18,2)    | NO   |     | NULL    |       |
| total_trade     | int(30)          | NO   |     | NULL    |       |
| total_volume    | int(30)          | NO   |     | NULL    |       |
| total_value     | decimal(18,4)    | NO   |     | NULL    |       |
+-----------------+------------------+------+-----+---------+-------+

股息信息:

+------------------+--------------+------+-----+-------------------+-----------------------------+
| Field            | Type         | Null | Key | Default           | Extra                       |
+------------------+--------------+------+-----+-------------------+-----------------------------+
| divident_ID      | int(11)      | NO   | PRI | NULL              | auto_increment              |
| company_id       | int(11)      | NO   |     | NULL              |                             |
| year             | year(4)      | NO   |     | NULL              |                             |
| right_base       | int(11)      | NO   |     | NULL              |                             |
| right_new        | int(11)      | NO   |     | NULL              |                             |
| right_dec_date   | date         | NO   |     | NULL              |                             |
| right_rec_date   | date         | NO   |     | NULL              |                             |
| interim_cash     | decimal(6,2) | NO   |     | NULL              |                             |
| interim_stock    | decimal(8,2) | NO   |     | NULL              |                             |
| interim_dec_date | date         | NO   |     | NULL              |                             |
| interim_rec_date | date         | NO   |     | NULL              |                             |
| annual_cash      | decimal(6,2) | NO   |     | NULL              |                             |
| annual_stock     | decimal(8,2) | NO   |     | NULL              |                             |
| annual_dec_date  | date         | NO   |     | NULL              |                             |
| annual_rec_date  | date         | NO   |     | NULL              |                             |
| update_time      | timestamp    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+------------------+--------------+------+-----+-------------------+-----------------------------+

你能帮我看看结果吗?

【问题讨论】:

  • 您的请求中的这个“结束”怎么样,这似乎是一个误解......
  • 在不同的查询中,结束没有产生任何问题,但更新了但没有运气
  • 考虑将问题简化为仅相关列,并为此提供适当的 DDL 和/或 sqlfiddle,连同所需的结果集

标签: mysql sql outer-join right-join


【解决方案1】:

这是您的查询:

SELECT c.code,c.name, a.ltp as begning, b.ltp as enddate, d.interim_cash,d.interim_rec_date,
       CAST(((b.ltp - a.ltp) / a.ltp * 100) AS DECIMAL(10, 2)) as chng
FROM eod_stock a JOIN
     eod_stock b
     ON a.company_id = b.company_id LEFT OUTER JOIN
     company AS c
     ON c.ID = a.company_id RIGHT JOIN
     divident_info d
     ON c.ID = d.company_id
WHERE a.entry_date = "2012-09-24" AND
      b.entry_date = "2012-09-25" AND
      d.interim_rec_date BETWEEN "2012-09-24" AND "2012-09-25" AND
      a.company_id IN (13, 2) AND
      d.company_id IN (13, 2);

就个人而言,我发现很难跟踪 left joins 与 right joins 混合的查询:仅使用 left joins 的结构更容易,因此您可以轻松查看哪个表驱动查询。

无论如何,您的where 子句正在撤消外连接的影响。除了您明确列出的条件外,您还说:

a.entry_date is not null and
b.entry_date is not null and
d.interim_rec_date is not null and
a.company_id is not null and
d.company_id is not null

很难说您需要消除哪些条件才能获得您想要的结果。我能说的是其中一些应该进入on 子句而不是where 子句。那是最好的解决方案。您还可以将where 更改为如下所示:

WHERE a.entry_date = "2012-09-24" AND
      b.entry_date = "2012-09-25" AND
      d.interim_rec_date BETWEEN "2012-09-24" AND "2012-09-25" AND
      a.company_id IN (13, 2) AND
      d.company_id IN (13, 2) AND
      (a.entry_date is null  or a.company_id is null or b.entry_date is null)

但是,您可能只需要其中的一两个条件。请注意d 上的条件应保留在where 子句中,因为right outer join 将所有行保留在d 中,因此不会是NULL(除非原始数据中的NULL)。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT c.code,c.name, a.ltp as begning, b.ltp as enddate, 
    d.interim_cash,d.interim_rec_date,
    CAST(((b.ltp - a.ltp) / a.ltp * 100) AS DECIMAL(10, 2)) as chng
    FROM eod_stock a
    JOIN eod_stock b ON a.company_id = b.company_id
    LEFT OUTER JOIN company AS c
    ON c.ID = a.company_id
    RIGHT JOIN divident_info AS d
    ON c.ID = d.company_id AND d.interim_rec_date BETWEEN "2012-09-24" AND "2012-09-25"
    AND d.company_id IN (13,2)    
    WHERE a.entry_date = "2012-09-24"
    AND b.entry_date = "2012-09-25"
    AND a.company_id IN (13, 2);
    

    【讨论】:

    • 它将其他结果留空。平均公司 id 没有返回结果
    【解决方案3】:

    所以最后我得到了我需要的查询:

     SELECT c.code,c.name, a.ltp as begning, b.ltp as enddate, d.interim_cash,d.interim_rec_date,      d.annual_rec_date,d.annual_cash,
     CAST(((b.ltp - a.ltp) / a.ltp * 100) AS DECIMAL(10, 2)) as chng
     FROM eod_stock AS a
    
     LEFT OUTER JOIN eod_stock AS b
     ON a.company_id = b.company_id
    
     LEFT OUTER JOIN company AS c
     ON c.ID = a.company_id
    
     LEFT OUTER JOIN dividend_info AS d
     ON c.ID = d.company_id AND d.interim_rec_date BETWEEN "2012-09-24" AND "2012-09-25" AND       d.annual_rec_date BETWEEN "2012-09-24" AND "2012-09-25"
    
     WHERE a.entry_date = "2013-09-24"
     AND b.entry_date = "2013-09-25"
     AND a.company_id IN (13, 2,4,5);
    

    感谢 Gordon Linoff 把我带到了我正在搞砸正确加入的赛道

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-14
      • 2011-02-23
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      相关资源
      最近更新 更多