我目前有一个不雅致的解决方案,它要求一次遍历数千行,我想知道是否可以用一条SQL语句来完成。
我有一个名为history
的数据库表,该表保存另一个名为inventory
的数据库上所有事务的记录。两个数据库共享一个称为pKey
的列(外键)。
我的库存数据库:
| ID | pKey | model | room | ip | active | ... |
我的历史数据库:pKey是外键
| ID | pKey | fieldName | oldValue | newValue |
在历史数据库中,单个pKey可能有20多个事务。我想在历史记录中查找所有具有以下内容的行:
A的fieldName和B的oldValue
C的fieldName和D的oldValue
相同的pKey。
即假设我们发现历史记录表中有一行,其中fieldName为A,旧值为B,仅当与该行关联的pKey在搜索fieldName为C和oldValue的行中也出现时,结果才有效D。
在进行了一些研究之后,似乎SELF JOIN将是一个不错的选择,但是由于我试图在同一列上进行SELF JOIN,所以我遇到了错误。这是我的声明:
SELECT pKey FROM `history` INNER JOIN history ON history.pKey=history.pKey WHERE `fieldName` = 'ipAddress' AND `oldValue` LIKE '129.97%'
编辑:我在这里写我的陈述是一个错误;我的意思只是选择pKey结果。
最佳答案
当需要执行SELF-JOIN时,必须为要连接的表的副本提供别名。
请在下面找到查询-双方都是别名:
SELECT
history_AB.pKey
FROM
history AS history_AB
INNER JOIN history AS history_CD
ON history_AB.pKey = history_CD.pKey
WHERE
(history_AB.fieldName = 'A' AND history_AB.oldValue LIKE 'B%')
AND (history_CD.fieldName = 'C' AND history_CD.oldValue LIKE 'D%')
在
WHERE
子句中,存在您在问题中提到的条件:(...)说我们发现历史记录表中有一行
A的fieldName和B的旧值,该结果仅在以下情况下有效
与该行关联的pKey也会在搜索行中出现
字段名称为C且oldValue为D
我希望我很好地理解了这个问题,它可能会在某种程度上帮助您。
关于mysql - 有没有办法在同一列上进行自连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28056463/