首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql三表连接结果空集

问Mysql三表连接结果空集
EN

Stack Overflow用户
提问于 2014-01-18 17:47:33
回答 3查看 621关注 0票数 0

你好,我已经加入了三个表,但它返回的是空结果,尽管假设有一些结果。这是我的sql

代码语言:javascript
复制
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);

我所期望的结果如下:

代码语言:javascript
复制
+--------+-----------------+---------+--------+--------+------------------+------------+
| 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:

代码语言:javascript
复制
+-----------------+------------------+------+-----+---------+-------+
| 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    |       |
+-----------------+------------------+------+-----+---------+-------+

分隔信息:

代码语言:javascript
复制
+------------------+--------------+------+-----+-------------------+-----------------------------+
| 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 |
+------------------+--------------+------+-----+-------------------+-----------------------------+

你能帮我查一下结果吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-19 12:53:42

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

代码语言:javascript
复制
 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);

谢谢戈登·林诺夫把我带到了我搞砸了的赛道上

票数 0
EN

Stack Overflow用户

发布于 2014-01-18 18:26:58

这是您的查询:

代码语言:javascript
复制
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子句都会取消外部联接的效果。除了明确列出的条件外,您还说:

代码语言:javascript
复制
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更改为如下所示:

代码语言:javascript
复制
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 )。

票数 1
EN

Stack Overflow用户

发布于 2014-01-18 18:53:06

试试这个:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21207636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档