【问题标题】:Full JOIN MySQL Query is returning empty完整的 JOIN MySQL 查询返回空
【发布时间】:2013-12-11 20:05:10
【问题描述】:

所以这是一个 MySQL 查询:

SELECT TestSite . * , LoggedCarts . * 
FROM TestSite, LoggedCarts
WHERE TestSite.email =  'LoggedCarts.Bill-Email'
LIMIT 0 , 30

它返回一个空的结果集,当它应该根据下表返回四个结果时。

第一个表:LoggedCarts - 列:Bill-Email

casedilla@hotmail.com
crazyandy@theholeintheground.com

第二个表:TestSite - 列:电子邮件

samuel@lipsum.com
taco@flavoredkisses.com
honeybadger@dontcare.com
casedilla@hotmail.com
messingwith@sasquatch.com

目标是获取一个 MySQL 语句,该语句返回 Table: TestSite 中与 Table: LoggedCarts 中的行不匹配的行。

注意:我知道在构造查询时在列名中使用连字符需要特别小心,包括使用反引号来告诉 MySQL 有特殊字符。我会更改列名以匹配,但是表:LoggedCarts 有数据通过雅虎购物车的帖子提供,并且在插入之前没有大量准备,将名称设置为除了帖子数据中发送的键之外的任何内容都令人生畏。

但是,如果事实证明在插入之前重建数据比使用 JOIN 语句更容易,或者由于某种原因使用两个具有不同名称的列作为比较列不起作用,我将通过并重建数据库和 PHP 代码。

【问题讨论】:

  • “LoggedCarts.Bill-Email”应该是一个字符串吗?
  • 你可能已经回答了你自己的问题...special care when constructing a query, involving 反引号 to tell MySQL there are special characters.
  • 请停止使用 SQL Server 标记 MySQL 问题。
  • 删除了额外的类别标签。列标识符周围的反引号导致未知列错误,而撇号导致发生连接,但所有 LoggedCart 表值均为 NULL。
  • FROM TestSite, LoggedCarts 不是“完全连接”(这与“完全外部连接”相同——MySQL 无法做到)——它是一个交叉连接。

标签: mysql


【解决方案1】:

单引号表示字符串文字。您需要对标识符使用反引号。此外,标识符的每个组成部分都必须单独引用。

SELECT TestSite . * , LoggedCarts . * 
FROM TestSite, LoggedCarts
WHERE TestSite.email =  LoggedCarts.`Bill-Email`
LIMIT 0 , 30

来自the manual:

如果多部分名称的任何组成部分需要引用,请单独引用它们而不是引用整个名称。例如,写 `my-table`.`my-column`,而不是 `my-table.my-column`。

【讨论】:

  • 反引号导致未知列错误。撇号允许连接发生,但 LoggedCarts 中的值都是 NULL。
  • 做到了,现在我只需要使用 != 或 运算符来反转它。谢谢!
【解决方案2】:

在一些给出的提示的启发下进行了一些研究,我在这里找到了我正在寻找的解决方案:SELECT * WHERE NOT EXISTS

完全符合我的需要,而且作为奖励,我喜欢使用的速记语法,它允许您为表名输入别名并在整个语句中使用别名。

SELECT *
FROM TestSite e
WHERE NOT EXISTS
    (
    SELECT  null 
    FROM    LoggedCarts d
    WHERE   d.`Bill-Email` = e.email
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多