我想选择哪里在选择,我做错了什么?
问题描述:
SELECT *
FROM `seriallog` WHERE `lastevent` IN
(SELECT GROUP_CONCAT(CONCAT(' \'', `eventid`, '\''))
FROM `permissions` WHERE `permissions`.`userpkid` = 1)
答
您可能试图将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
答
你写它的方式,内部查询将返回一个字符串像这样"1, 2, 3"
只行seriallog
与lastevent
列的"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,想必更有效地执行它。
答
这是MySQL最优化的格式。一般来说,MySQL不喜欢子查询。
SELECT * FROM SL seriallog加入 上sl.lastevent权限P = p.eventid WHERE permissions.userpkid = 1
什么是你期待得到什么?你究竟得到了什么? – 2010-06-01 16:13:24