2017-05-16 42 views
-1

我有以下SQL查询:SQL子查询:行中找不到

SELECT t1.`userID`,`name`, COUNT(*) AS `count`, (SELECT `val` FROM `user-data` WHERE `userID` = t1.userID AND `keyID` = 2 LIMIT 1) AS `staff` 
FROM `activity` t1 
LEFT JOIN `users` ON `users`.`id` = t1.`userID` 
WHERE 
t1.`userID` <> 0 
GROUP BY t1.`userID` 
ORDER BY `count` DESC LIMIT 10 

其中一期工程,它需要大约2秒。但是,我想找个地方staff <> 1条目:

SELECT t1.`userID`,`name`, COUNT(*) AS `count`, (SELECT `val` FROM `user-data` WHERE `userID` = t1.userID AND `keyID` = 2 LIMIT 1) AS `staff` 
FROM `activity` t1 
LEFT JOIN `users` ON `users`.`id` = t1.`userID` 
WHERE 
t1.`userID` <> 0 
AND `staff` <> 1 
GROUP BY t1.`userID` 
ORDER BY `count` DESC LIMIT 10 

我得到的错误:Unknown column 'staff' in 'where clause'

我可以把子查询的WHERE子句中,但随后的查询需要70秒。

但我当然应该可以访问我在SELECT语句中引用的列吗?

+1

'和staff' <'是不完整的 –

+0

只是检查,你忘了在你的查询中添加AND'staff' <> 1? – lloiacono

+0

不,你不应该。选择列表在** where子句后处理**。 – Shadow

回答

2

由于选择列表是在where子句之后处理的,因此不能通过其别名引用where子句中的任何计算字段。

您可以将子查询移入加入,只要它返回一个只记录,即使没有限制条款:

SELECT t1.`userID`,`name`, COUNT(*) AS `count`, `user-data`.`val` as staff 
FROM `activity` t1 
LEFT JOIN `users` ON `users`.`id` = t1.`userID` 
LEFT JOIN `user-data` ON `user-data`.`userID`=t1.userID AND `user-data`.`keyID` = 2 
WHERE 
    t1.`userID` <> 0 
    AND `user-data`.`val` <> 1 
GROUP BY t1.`userID`, `user-data`.`val` 
ORDER BY `count` DESC 
LIMIT 10 
+0

谢谢你,完美的工作! – Chud37

+0

@Strawberry:我知道员工的价值来自哪里,它在子查询中有所描述。从子查询中,还可以推导出如何在没有模式的情况下将表连接在一起。如果破坏你的评论值得赞成,那就这样吧。 – Shadow