我有一个表 Transactions
看起来与此类似:
id Type Field ObjectId NewValue
1 AddLink HasMember 4567 someDomain/someDirectory/1231
2 AddLink HasMember 4567 someDomain/someDirectory/1232
3 AddLink HasMember 4567 someDomain/someDirectory/1233
4 DeleteLink HasMember 4567 someDomain/someDirectory/1231
“NewValue”的数字结尾是我感兴趣的。
详细来说,我需要那些记录,其中我有一条类型为“AddLink”的记录,并且不存在类型为“DeleteLink”的较新记录,即 id
= 2 或 3 的记录(因为 4 删除 1)
“ObjectId”和“NewValue”的数字位都是“tickets”表条目的ID,我需要相关的tickets。
我试过这个:
SELECT `Tickets`.* FROM `Transactions` AS `addedLinks`
LEFT JOIN `Tickets` ON RIGHT (`addedLinks`.`NewValue`, 4) = `Tickets`.`id`
WHERE `addedLinks`.`Type` = 'AddLink'
AND `addedLinks`.`Field` = 'Hasmember'
AND `addedLinks`.`ObjectId` = '4567'
AND NOT RIGHT (`addedLinks`.`NewValue`, 4) in (
SELECT `Tickets`.* FROM `Transactions` AS `deletedLinks`
LEFT JOIN `Tickets` ON RIGHT (`deletedLinks`.`NewValue`, 4) = `Tickets`.`id`
WHERE `deletedLinks`.`Type` = 'DeleteLink'
AND `addedLinks`.`id` < `deletedLinks`.`id`
AND `deletedLinks`.`Field` = 'Hasmember'
AND `deletedLinks`.`ObjectId` = '4567' )
这给了我:
SQL Error (1241): Operand should contain 1 column(s)
除非我弄错了,否则问题是
RIGHT (`addedLinks`.`NewValue`, 4)
在“AND NOT ... in()”语句中。
有人能给我指出正确的方向吗?
[编辑] 感谢 David K-J,以下工作:
SELECT `Tickets`.* FROM `Transactions` AS `addedLinks`
LEFT JOIN `Tickets` ON RIGHT (`addedLinks`.`NewValue`, 4) = `Tickets`.`id`
WHERE `addedLinks`.`Type` = 'AddLink'
AND `addedLinks`.`Field` = 'Hasmember'
AND `addedLinks`.`ObjectId` = '5376'
AND NOT (RIGHT (`addedLinks`.`NewValue`, 4)) in (
SELECT `id` FROM `Transactions` AS `deletedLinks`
WHERE `deletedLinks`.`Type` = 'DeleteLink'
AND `addedLinks`.`id` < `deletedLinks`.`id`
AND `deletedLinks`.`Field` = 'Hasmember'
AND `deletedLinks`.`ObjectId` = '5376' )
但我不明白为什么?
最佳答案
这里的问题是您的子选择,因为您使用它来提供 IN
子句的值,您的子选择应该只选择 id 字段,即 Transactions。 *
-> Transactions.id
所以你最终得到:
...
AND NOT (RIGHT (`addedLinks`.`NewValue`, 4)) IN
SELECT id FROM Transactions AS deletedLinks WHERE
...
这样做的原因是 IN
需要一个列表来比较,所以 foo IN ( 1,2,3,4,5 )
。如果您的子查询选择多个字段,则结果列表在概念上是一个列表列表 (AoAs),例如 [1, 'a'], [2, 'b'], [3, 'c']
并且它会向你提示 =)
关于没有列值的 'not in'的mysql用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35750829/