【问题标题】:MySQL referencing outer select in subqueryMySQL 在子查询中引用外部选择
【发布时间】:2014-04-03 19:07:07
【问题描述】:

我有两张桌子,货物和客户。我想在货物中打印出客户的姓氏。表设置为:

shipments:  shipNumber, shipperID, destID, size, weight

shipperID 和 destID 是客户表中的外键。

customers:  id, lastName, street, city, state, zip.

我查询时想要的是这样的表:

shipNumber, shipperID(customers.id), customer.lastName, destID(customers.id), customer.lastName

shipperID 和 destID 不相同,因此 customers.lastName 字段应该只与它们之后的 id 字段相关。

由于显而易见的原因,我当前的查询不起作用:

SELECT shipments.shipNumber, shipments.shipperID, customers.lastName, shipments.destID, 
(SELECT customers.lastName 
FROM shipments, customers 
WHERE shipments.destID = customers.id)

FROM shipments, customers
WHERE shipments.shipperID = customers.id;

我的子查询显然会打印多行,但我希望 destID 引用的客户的姓氏与船号相关,但我知道 mySQL 会从内到外查看查询。

样本数据:

shipments table
+------------+-----------+---------+------+--------+
| shipNumber | shipperID | destID  | size | weight |
+------------+-----------+---------+------+--------+
| S12345-0   | W-100     | C-22315 |   12 |     12 | 
| SYY89-4    | C-15572   | U-01002 |   12 |     12 | 
+------------+-----------+---------+------+--------+

customers table
+---------+------------------+
| id      | lastName         |
+---------+------------------+
| S-01210 | Home Depot       | 
| S-18537 | Honda            | 
| S-13349 | NCR              | 
| C-15572 | GM               | 
| C-00122 | Delco            | 
| W-100   | Warehouse A      | 
| U-01002 | Wright State     | 
| W-210   | Warehouse B      | 
| U-00013 | AFIT             | 
| C-22315 | Northrop Grumman | 
+---------+------------------+

我希望查询显示的内容:

shipNumber    shipperID    lastName     destID   lastName
S12345-0      W-100        Warehouse A  C-22315  Northrop Grumman

这是提供给我的数据,因此用非姓氏数据填充的 lastName 列可能只是一个疏忽,所以就这样吧。

【问题讨论】:

  • 你能提供一些示例数据吗?
  • @JohnRuddell 添加了示例数据和查询将产生的示例。由于有两批货物,查询实际上会打印出两行。

标签: mysql select reference subquery


【解决方案1】:

如果我正确理解您的问题,您不需要子查询,只需将两个表连接在一起即可。客户需要加入两次。一次用于shipperID,一次用于destID,以获得相应的姓氏。这个查询应该可以解决问题。请参阅工作FIDDLE

SELECT 
    s.shipNumber, 
    s.shipperID, 
    c.lastName AS first_last_name, 
    s.destID, 
    c1.lastName AS second_last_name
FROM shipments s
JOIN customers c ON c.id = s.shipperID
JOIN customers c1 ON c1.id = s.destID

【讨论】:

  • 在我的问题的底部,我添加了我希望查询打印出来的内容。您的查询不会打印出最后一个字段。
  • 我在你拿到样品之前就回复了。让我做一个小提琴,我会回复你
  • 刚刚编辑过。我为表格添加了别名,以便于阅读和重新格式化它。您必须加入客户两次,一次是托运人姓氏,一次是目的地姓氏。希望对您有所帮助
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多