2010-06-01 54 views
0
SELECT * 
FROM `seriallog` WHERE `lastevent` IN 
(SELECT GROUP_CONCAT(CONCAT(' \'', `eventid`, '\'')) 
     FROM `permissions` WHERE `permissions`.`userpkid` = 1) 
+2

什么是你期待得到什么?你究竟得到了什么? – 2010-06-01 16:13:24

回答

3

您可能试图将int(lastevent)与串联字符串(子查询的结果)进行比较。

这是很难说没有更多的信息,但是这可能是你想要做什么:

select * 
from seriallog sl 
inner join permissions p on sl.lastevent = p.eventid 
where p.userpkid = 1 
+0

可能想写这样的第一行:'SELECT sl。*' – Sonny 2010-06-01 20:12:56

2

你写它的方式,内部查询将返回一个字符串这样"1, 2, 3"只行serialloglastevent列的"1, 2, 3"恰好相符。

你大概有兴趣匹配其值在SET中的任何行。这就是SQL设计的目的;你不必申请任何特殊的工程。下面将工作:

SELECT * 
FROM seriallog WHERE lastevent IN 
(SELECT eventid FROM permissions WHERE permissions.userpkid = 1) 

然而,这将是可取的,而不是写:

SELECT * 
FROM seriallog 
WHERE EXISTS (SELECT 1 FROM permissions WHERE eventid = seriallog.lastevent AND permissions.userpkid = 1) 

这使得MySQL的对待查询更像是JOIN,想必更有效地执行它。

0

这是MySQL最优化的格式。一般来说,MySQL不喜欢子查询。

SELECT * FROM SL seriallog加入 上sl.lastevent权限P = p.eventid WHERE permissions.userpkid = 1

相关问题