【问题标题】:MySql Select Query - Getting errors from WHERE clauseMySql 选择查询 - 从 WHERE 子句获取错误
【发布时间】:2012-01-24 14:47:49
【问题描述】:

我是 MySQL 新手。

SELECT
     receive_item.RECEIPT_ID,
     receive_item.ITEM_ID, 
     (receive_item.QTY - delivery_item.QTY) AS QtyRemained 
FROM receive_item
INNER JOIN delivery_item
ON receive_item.ITEM_ID = delivery_item.ITEM_ID 
AND receive_item.RECEIPT_ID = delivery_item.RECEIVE_ID

这是上面查询的结果

RECEIPT_ID ITEM_ID  QTYRemained
    1         1         0
    2         2         0
    3         3         1
    4         4         0
    5         5         0

我只想显示 QTYRemained 值不为 0 的行。 像这样的

RECEIPT_ID ITEM_ID  QTYRemained
    3         3         1

当我在上面的选择查询末尾添加“From QTYRemained != 0”时出现错误。 谁能告诉我为什么它不起作用?

【问题讨论】:

  • 您忘记了 WHERE 子句。我在您的代码中没有看到 WHERE 子句。
  • 错误信息很有用。您应该将您的问题作为问题的一部分发布
  • 补充一下 Phil 所说的内容,您是否收到了实际的错误消息,例如查询无效还是仅返回 0 个结果?因为这很重要。

标签: mysql select


【解决方案1】:

最后添加

WHERE QtyRemained > 0

所以...

SELECT
     receive_item.RECEIPT_ID,
     receive_item.ITEM_ID, 
     (receive_item.QTY - delivery_item.QTY) AS QtyRemained 
FROM receive_item
INNER JOIN delivery_item
ON receive_item.ITEM_ID = delivery_item.ITEM_ID 
AND receive_item.RECEIPT_ID = delivery_item.RECEIVE_ID
WHERE QtyRemained > 0

【讨论】:

  • 不能在 where 中使用“QtyRemained”别名
【解决方案2】:

使用having 而不是where

SELECT
     receive_item.RECEIPT_ID,
     receive_item.ITEM_ID, 
     (receive_item.QTY - delivery_item.QTY) AS QtyRemained 
FROM receive_item
INNER JOIN delivery_item
ON receive_item.ITEM_ID = delivery_item.ITEM_ID 
AND receive_item.RECEIPT_ID = delivery_item.RECEIVE_ID
having QtyRemained > 0

或者你可以像下面这样:

SELECT
     receive_item.RECEIPT_ID,
     receive_item.ITEM_ID, 
     (receive_item.QTY - delivery_item.QTY) AS QtyRemained 
FROM receive_item
INNER JOIN delivery_item
ON receive_item.ITEM_ID = delivery_item.ITEM_ID 
AND receive_item.RECEIPT_ID = delivery_item.RECEIVE_ID
where (receive_item.QTY - delivery_item.QTY) > 0

【讨论】:

  • 没有人......总是不正确。这里的问题是别名。我们不能在哪里使用。我试过了,它的工作原理
  • 我更倾向于将查询创建为视图(甚至是内联视图)。 HAVING真的仅用于将条件应用于聚合列
  • @Phil 请参阅stackoverflow.com/questions/200200/… 16 人赞成相同的答案
  • 我认为如果我们不指定,它将使用主键列进行隐式分组。这不会有任何区别
  • @bowlerae MySQL 得到了精灵粉的慷慨帮助来处理类似的事情。能够从GROUP BY 语句中排除非聚合列是另一回事
【解决方案3】:

因为我是个老顽固,拒绝在没有GROUP BY 子句的情况下使用HAVING,这里有一个替代解决方案

SELECT
     ri.RECEIPT_ID,
     ri.ITEM_ID, 
     (ri.QTY - di.QTY) AS QtyRemained 
FROM receive_item ri
INNER JOIN delivery_item di
ON ri.ITEM_ID = di.ITEM_ID 
AND ri.RECEIPT_ID = di.RECEIVE_ID
WHERE ri.QTY > di.QTY

真的很简单

【讨论】:

    【解决方案4】:

    试试:-

    SELECT
         receive_item.RECEIPT_ID,
         receive_item.ITEM_ID, 
         (receive_item.QTY - delivery_item.QTY) AS QtyRemained 
    FROM receive_item
    INNER JOIN delivery_item
    ON receive_item.ITEM_ID = delivery_item.ITEM_ID 
    AND receive_item.RECEIPT_ID = delivery_item.RECEIVE_ID
    group by receive_item.RECEIPT_ID
    Having QtyRemained > 0
    

    【讨论】:

    • 不能在 where 中使用“QtyRemained”别名
    • “哪里”在哪里?我没有添加任何地方。
    猜你喜欢
    • 2013-09-04
    • 2019-06-10
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多