【问题标题】:complex SQL query return result if AND not matched如果 AND 不匹配,复杂的 SQL 查询返回结果
【发布时间】:2014-08-16 03:32:41
【问题描述】:

我写了一个复杂的 SQL 查询(它)运行正确:

select user.id,user.name,profile.info,score.ammount
from user,profile,score
where email = 'example@email.com'
AND user.id = profile.user_id
AND user.id = score.user_id
AND profile.type = 'language'
AND score.type = 'amount'

此查询将返回:

[id] => 10002096
[name] => Erik
[info] => English
[ammount] => 510710

问题是如果user.id 与profile.user_id 不匹配,之前的匹配结果如(user.id, user.name) 没有返回? (即使找不到下一个匹配项,我也想返回它)

如果不匹配想要返回类似的东西:

[id] => 10002096
[name] => Erik

如何解决这个问题?

配置文件示例:

id          user_id    type         info  
1             1        language     english
2             1        admin        top  
3             2        likes        football
4             3        likes        -
5             3        language     english

id = 2 的用户没有语言

【问题讨论】:

  • 好吧,没有看到任何数据,我的第一反应是“嗯?”但也许 tyr 将一些 AND 更改为 OR?你应该展示一些数据让我们理解你的意思
  • 您对 AND 的含义存在根本性的误解。为了返回结果,它必须通过所有 AND 语句。
  • 放弃旧式逗号语法进行连接操作。请改用 JOIN 关键字,并将连接谓词从 WHERE 子句移至 ON 子句。这将使您能够使用LEFT JOIN 进行“外部”连接操作,

标签: mysql sql


【解决方案1】:

尝试左连接表格而不是获取笛卡尔积和过滤。这是连接表格的旧 ansi 方式,并且随着您添加更多表格而更难处理。

SELECT u.id, u.name, p.info, s.ammount
FROM user u
LEFT JOIN profile p ON p.user_id = u.id AND p.type = 'language'
LEFT JOIN score s ON s.user_id = u.id AND s.type = 'amount'
WHERE email = 'example@email.com'

基本上左连接表示加入信息,如果有不匹配的行则不过滤

【讨论】:

  • 仅供参考,OP 的查询不是笛卡尔结果,它们只是在 where 子句中使用带有连接条件的“旧”逗号连接语法。
  • @bluefeet 我知道.. 抱歉没有完全指定。它是旧的 ansi 方式.. 但通常不是一个好方法
  • 同样的问题(如果p.type = 'language' not found)没有返回结果?
  • @mwafi 你能提供一些数据吗?给我几行 p.type 也不是语言的行
  • @JohnRuddell 无法保证在配置文件表中找到(类型 = 语言)(将更新 qustion)
猜你喜欢
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2011-01-19
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多