【问题标题】:inner join returns wrong value for 1 of the fields内部连接为 1 个字段返回错误值
【发布时间】:2013-10-05 19:48:18
【问题描述】:

我正在使用以下查询从 mysql 数据库中提取信息,虽然我得到了正确的 min(qt.quote_price) 值,但我得到了错误的 st.Supplier_id 值。

它似乎从满足 where 子句的表中返回第一个 st.Supplier_id,但显然我希望它返回带有 min(qt.quote_price) 的行的 st.Supplier_id。

我确信这很简单,但由于某种原因我无法弄清楚,希望有人能指出我正确的方向。

SELECT ft.fuel_type_id, ft.fuel_name, st.Supplier_id, st.company_name as company_name, st.email, qt.supplier_id, qt.timestamp, qt.fuel_type_id, min( qt.quote_price ) AS best_derv
FROM tbl_quote qt
INNER JOIN `tbl_suppliers` st ON qt.supplier_id = st.Supplier_id
INNER JOIN `tbl_fuel-type` ft ON qt.fuel_type_id = ft.fuel_type_id
WHERE qt.fuel_type_id =3 AND qt.timestamp > date_sub( NOW(), INTERVAL 7 DAY )

我已将查询编辑为可行的内容,但我希望能提供任何改进它的帮助(如果可能的话)。

SELECT qt.quote_id, ft.fuel_type_id, ft.fuel_name, st.Supplier_id, st.company_name as company_name, st.email, qt.supplier_id, qt.timestamp, qt.fuel_type_id, min( qt.quote_price ) AS best_derv
FROM tbl_quote qt
INNER JOIN `tbl_suppliers` st ON qt.supplier_id = st.Supplier_id
INNER JOIN `tbl_fuel-type` ft ON qt.fuel_type_id = ft.fuel_type_id
WHERE qt.quote_price = (Select min(quote_price) from tbl_quote where fuel_type_id =3 AND timestamp > date_sub( NOW(), INTERVAL 7 DAY ))

【问题讨论】:

  • 请创建 sql fiddle 并将查询最小化为最小示例,仍然重现错误。删除所有不必要的字段和不相关的表。 sqlfiddle.com
  • 它告诉我,我正在返回 tbl_quote 表中的所有行,这是我的问题,明天我会继续处理它。谢谢

标签: mysql inner-join


【解决方案1】:

您需要添加一个列出所有非聚合列的GROUP BY 子句:

SELECT ft.fuel_type_id, ft.fuel_name, st.Supplier_id, st.company_name as company_name, st.email, qt.supplier_id, qt.timestamp, qt.fuel_type_id, min( qt.quote_price ) AS best_derv
FROM tbl_quote qt
INNER JOIN `tbl_suppliers` st ON qt.supplier_id = st.Supplier_id
INNER JOIN `tbl_fuel-type` ft ON qt.fuel_type_id = ft.fuel_type_id
WHERE qt.fuel_type_id =3
AND qt.timestamp > date_sub( NOW(), INTERVAL 7 DAY )
GROUP BY ft.fuel_type_id, ft.fuel_name, st.Supplier_id, st.company_name, st.email, qt.supplier_id, qt.timestamp, qt.fuel_type_id

在所有其他(非 mysql)数据库中,您会收到描述问题的错误消息,但 mysql 允许这种情况,在这种情况下,它返回第一行而不是聚合行。

【讨论】:

  • 我将 st.company_name 更改为 company_name,更改为 st.company_name 或 company_name,它返回了符合 where 条件的 3 行,我需要弄清楚如何只显示我想要的行,谢谢.
  • 糟糕,我只是复制粘贴(我已修复答案)。现在,“正确的行”是什么意思?告诉我更多,我可以帮助你
  • 我只想返回包含 min(qt.quote_price) 的行,以便稍后在网页上使用该行中的 company_name 和其他字段来创建自动电子邮件并更新其他表在数据库中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2020-11-19
相关资源
最近更新 更多