我正在使用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
答案 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
。