没有列值的 'not in'的mysql用法

标签 mysql

我有一个表 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/

相关文章:

php - MySQL 插入问题不大

php - 合并两个mysql组查询

mysql - Zend 框架 2 : LEFT JOIN issue

php - 插入记录时出错无法添加或更新子行 : a foreign key constraint fails

mysql - 使用主键索引删除 MySQL 中的行

php - 将自定义 MySQL 查询移至 PHP 中

mysql - 如何检索某个日期范围内的所有记录,然后按一天中的时间进行筛选?

mysql - 在 MariaDB 中启用 NO_BACKSLASH_ESCAPES 有什么影响?

mysql - 为什么这个查询对于 70k+ 行真的很慢?

php - 数据抓取/重组速度