我目前有一个不雅致的解决方案,它要求一次遍历数千行,我想知道是否可以用一条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/

10-10 10:42