【问题标题】:Joining two tables with using value from left table使用左表中的值连接两个表
【发布时间】:2012-04-08 01:20:49
【问题描述】:

我正在尝试编写一个连接另一个表的查询,但在这种情况下,我需要在我的子查询中使用左表中的一列中的值。这样做时,我收到一条错误消息,指出 mySQL 找不到具有此类名称的列。

首先,这是我的查询,它引用了 2 个表(t1 和 t2)(@category 是从我的程序中插入的参数):

SELECT t1.incID, t1.name, t1.sortBy, SQ.person, SQ.pointsValue
FROM table1 t1
LEFT OUTER JOIN (
    SELECT incID, person, IF( t1.sortBy=0, max(points), min(points) ) pointsValue
    FROM table2
    GROUP BY incID
) SQ ON SQ.incID = t1.incID
WHERE t1.category=@category
ORDER BY t1.name ASC
LIMIT 0 , 30

现在,当我执行此查询时,返回的错误如下:#1054 - Unknown column 't1.sortBy' in 'field list'

如果我将 t1.sortBy=0 替换为 0=0,则查询执行良好,所以看起来我只是对 mySQL 如何执行其操作顺序感到困惑?

有人可以澄清一下 mySQL 是如何对这样的查询进行操作顺序的,以及我该如何解决这个问题?

【问题讨论】:

  • 错误提示table1 中没有sortby 列。
  • @user1110302 问题出在括号内——为什么不把这部分移到外部查询中呢? IF( t1.sortBy=0, max(points), min(points) ) pointsValue

标签: mysql sql mysql-error-1054


【解决方案1】:

您不能在派生表中引用外部表。您需要将 IF 逻辑向外移动:

SELECT t1.incID, t1.name, t1.sortBy, SQ.person, 
       IF( t1.sortBy=0, maxPoints, minPoints) pointsValue
FROM table1 t1
LEFT OUTER JOIN (
    SELECT incID, person, max(points) maxPoints, min(points) minPoints
    FROM table2
    GROUP BY incID
) SQ ON SQ.incID = t1.incID
WHERE t1.category=@category
ORDER BY t1.name ASC
LIMIT 0 , 30

【讨论】:

  • 此时,让第二个查询从我的第一个查询中提取 t1.sortBy 的值,而不是让 mySQL 拉两个表然后执行逻辑会更有效吗?
  • 取决于数据库引擎的优化。我相信,考虑到 30 条记录的限制,嵌套在 IF 中的 min 和 max 子查询会更快,但我之前错了:-) 再说一次,如果 (incID, person) 上有索引,事情应该很快够了。
  • 甜蜜!感谢您的帮助,我真的很感激! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多