从MySQL表中获取详细信息而不进行子查询

时间:2017-10-26 12:55:18

标签: mysql subquery query-optimization

我正在使用raw=open('examples.txt') text=raw.read().replace('\n', '') words = text.split() ............... 查询从2个表中获取数据。我在 table2 中有一个状态MySQL。我需要获取状态为Transfer Out的所有详细信息,同时,Transfer Out之后不应添加Transfer In状态的任何详细信息。 因此,我不应该在Transfer Out 之后获得Transfer back In的详细信息。

现在我正在使用Transfer Out。但是当数据计数越来越高时,就会导致超时问题。有没有更好的方法来重写查询并获得相同的结果?

我的查询示例

subquery

2 个答案:

答案 0 :(得分:0)

您可以通过例如

对一组进行此操作
select something
from somehwere
group by something having isnull(max(out_date),0) > isnull(max(indate) ,0)

例如

DROP TABLE IF EXISTS LOANS;

CREATE TABLE LOANS (ID INT AUTO_INCREMENT PRIMARY KEY, ISBN INT,DIRECTION VARCHAR(3), DT DATETIME);

INSERT INTO LOANS(ISBN,DIRECTION,DT) VALUES
(1,'OUT','2017-10-01 09:00:00'),
(2,'OUT','2017-10-02 10:00:00'),
(2,'IN', '2017-10-02 10:10:00'),
(3,'REC','2017-10-02 10:00:00'),
(4,'REC','2017-10-02 10:00:00'),
(4,'OUT','2017-10-03 10:00:00'),
(4,'IN', '2017-10-04 10:00:00'),
(4,'OUT','2017-10-05 10:00:00')
;

SELECT ISBN
FROM   LOANS
WHERE  DIRECTION IN('OUT','IN') 
GROUP BY ISBN HAVING        
         MAX(CASE WHEN DIRECTION = 'OUT' THEN DT ELSE 0 END)  >
         MAX(CASE WHEN DIRECTION = 'IN'  THEN DT ELSE 0 END) ;

结果

+------+
| ISBN |
+------+
|    1 |
|    4 |
+------+
2 rows in set (0.00 sec)

如果DT上有平局,你可以替换id。

答案 1 :(得分:0)

更改

( SELECT COUNT(id) FROM ... ) = 0

EXISTS ( SELECT 1 FROM ... )

摆脱最外层的查询和第一个pt.timestamp。 (或者pt.timestamp是否有一些模糊的原因?)

table2需要INDEX(type, partner_gid, shelter_gid, timestamp)timestamp必须是最后一个,但其他人可以是任何顺序。

table2需要INDEX(type, partner_gid, shelter_gid, animal_nid);列可以按任何顺序排列。 (此索引不能与前一个索引相结合。)

og_membership需要INDEX(etid, entity_type)(按任意顺序)。

为什么查询中有INNER JOIN table1 n ON(n.nid=og.etid)?似乎根本没有使用table1 - 除了可能用于验证行的存在。如果可能,请将其删除。

更改后,请为2(或3 ??)表提供EXPLAIN SELECT ...SHOW CREATE TABLE