代码之家  ›  专栏  ›  技术社区  ›  gsueagle2008

不存在的mysql连接

  •  63
  • gsueagle2008  · 技术社区  · 15 年前

    我有一个连接两个表的mysql查询

    • 选民
    • 家庭 他们加入了选民的行列。

      现在,我需要做的是修改它,将投票表与第三个名为elegation的表连接在一起的位置,以及voter.id和elegation.voter_id,接下来要做的就是排除投票表中在elegation表中有相应记录的任何记录。如何创建查询来执行此操作?

    这是我当前的查询

    SELECT `voter`.`ID`, `voter`.`Last_Name`, `voter`.`First_Name`,
           `voter`.`Middle_Name`, `voter`.`Age`, `voter`.`Sex`,
           `voter`.`Party`, `voter`.`Demo`, `voter`.`PV`,
           `household`.`Address`, `household`.`City`, `household`.`Zip`
    FROM (`voter`)
    JOIN `household` ON `voter`.`House_ID`=`household`.`id`
    WHERE `CT` = '5'
    AND `Precnum` = 'CTY3'
    AND  `Last_Name`  LIKE '%Cumbee%'
    AND  `First_Name`  LIKE '%John%'
    ORDER BY `Last_Name` ASC
    LIMIT 30 
    
    3 回复  |  直到 6 年前
        1
  •  144
  •   Kaii    8 年前

    我可能会使用左联接,它将返回行,即使没有匹配,然后您可以通过检查空值仅选择没有匹配的行。

    所以,有点像:

    SELECT V.*
    FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id
    WHERE E.voter_id IS NULL
    

    这是否比使用子查询效率高或低取决于优化、索引、每个投票人是否可以有多个排除等。

        2
  •  4
  •   Ian Clelland    15 年前

    我会用一个“不存在的地方”——正如你在标题中建议的那样:

    SELECT `voter`.`ID`, `voter`.`Last_Name`, `voter`.`First_Name`,
           `voter`.`Middle_Name`, `voter`.`Age`, `voter`.`Sex`,
           `voter`.`Party`, `voter`.`Demo`, `voter`.`PV`,
           `household`.`Address`, `household`.`City`, `household`.`Zip`
    FROM (`voter`)
    JOIN `household` ON `voter`.`House_ID`=`household`.`id`
    WHERE `CT` = '5'
    AND `Precnum` = 'CTY3'
    AND  `Last_Name`  LIKE '%Cumbee%'
    AND  `First_Name`  LIKE '%John%'
    
    AND NOT EXISTS (
      SELECT * FROM `elimination`
       WHERE `elimination`.`voter_id` = `voter`.`ID`
    )
    
    ORDER BY `Last_Name` ASC
    LIMIT 30
    

    这可能比执行左联接(当然,这取决于您的索引、表的基数等)快得多,而且几乎可以肯定 许多的 比在中使用更快。

        3
  •  3
  •   AamirR    6 年前

    有三种可能的方法可以做到这一点。

    1. 选择权
            SELECT  lt.* FROM    table_left lt
            LEFT JOIN
                table_right rt
            ON      rt.value = lt.value
            WHERE   rt.value IS NULL
    
    1. 选择权
            SELECT  lt.* FROM    table_left lt
            WHERE   lt.value NOT IN
            (
            SELECT  value
            FROM    table_right rt
            )
    
    1. 选择权
            SELECT  lt.* FROM    table_left lt
            WHERE   NOT EXISTS
            (
            SELECT  NULL
            FROM    table_right rt
            WHERE   rt.value = lt.value
            )