【问题标题】:Retrieving 2 rows from one SELECT sql query with 2 tables PHP从一个带有 2 个表 PHP 的 SELECT sql 查询中检索 2 行
【发布时间】:2014-06-05 13:33:12
【问题描述】:
QUOTES TABLE
-----------------
QUOTE_ID_PK  PICKUP_FROM_ID  DROPOFF_TO_ID
1               4                     3
2               2                     3
3               1                     1
4               1                     2
5               3                     2


TOWN TABLE
---------------
 TOWN_ID_PK  DISTANCE    NAME
    1        34          South Central 
    2        43          airport
    3        99          bus station
    4        66          train station

我有 2 个表格可以计算出一个简单的距离公式。

我需要为订单表中的 ORDER_ID 返回 2 行(带有距离值)。

我得到 order_id =2 ,pickupfromdistance=43,dropoffto=99 的结果。

我已经尝试了这个站点的一些想法,这是我所拥有的几乎可以工作,但不返回第二个距离值的方法。我是不是走错了路?我是否正在为一个简单的问题制定复杂的解决方案?

SELECT town.town_id_pk AS townID, town.distance AS distance, town.name AS townName, town.location AS location, quotes.pickupfrom_id, quotes.dropoffto_id 
FROM town, quotes 
WHERE quotes.pickupfrom_id=town.town_id_pk 
AND quotes.quote_id_pk = '140419420'
UNION ALL
SELECT town.town_id_pk AS townID, town.distance AS distance, town.name AS townName, town.location AS location, quotes.pickupfrom_id, quotes.dropoffto_id
FROM town, quotes 
WHERE quotes.dropoffto_id=town.town_id_pk 
AND quotes.quote_id_pk = '140419420'";

例如 我正在选择:

QUOTE_ID_PK=2, wh

(PICKUP_FROM_ID=2,DROPOFF_TO_ID=3)

我想要的结果是这样的:

TOWN_ID_PK=2, DISTANCE=43, NAME=AIRPORT

那么下一行将是

TOWN_ID_PK=3, DISTANCE=99, NAME= BUS STATION

一旦我知道哪个距离更远,我就可以继续使用代码来计算每 klm 的费率等(我可以自己计算这部分)。

【问题讨论】:

  • 1) 学习使用 JOIN 2) 只有当接送点和下车点与您的基点完全相反时,您的距离才有意义
  • quote_id_pk 未在报价表中列出。您能否列出该表的完整结构(或至少所有相关列)?
  • 哇,谢谢你们的快速反应。实际的表格比我上面制作的示例信息要多得多。是的,马克我明白你的意思。我将一个城镇作为“basetown”,然后将其他城镇作为“与基地的距离”......所以当用户输入从 TOWN A 到 TOWN B 的搜索时,sql 将在数据库中查找以检查任一城镇都是 BASETOWN,然后根据最长距离计算出从那里的距离和成本
  • 修正了上面显示 quote_id_pk joseph 的表格。
  • 您原来的 UNION ALL 方法似乎工作正常。请参阅此小提琴 - sqlfiddle.com/#!2/8dbd3/4 请确保 quote_id_pk 是 varchar(因为您已将 140419420 括在单引号中)。

标签: php sql select union


【解决方案1】:

您只是想了解两个城镇的距离吗?如果是这样,您可以使用join

select oq.*, tfrom.distance as distance_from, tto.distance as to_distance
from OrderQuotes oq left outer join
     Towns tfrom
     on oq.PICKUP_FROM_TOWN_ID = tfrom.town_id_pk left outer join
     Towns tto
     on oq.PICKUP_TO_TOWN_ID = tto.town_id_pk;

【讨论】:

  • 试图获取两个城镇的距离,然后计算出哪个城镇最远,以计算每公里的费率
  • @user3556674 。 . .这似乎与最初描述的问题相去甚远。我建议您删除此问题并提出另一个问题。包括样本数据、您想要的结果以及对实际问题的解释。仅仅修改这个问题对已经尝试回答的人来说是不公平的。
  • sorry gordon,这是我第一次使用 stackoverflow 提问。我已经用我正在尝试做的事情更新了这个问题。 EG 我选择 QUOTE_ID_PK=2, wh (其中有 PICKUP_FROM_ID=2, 和 DROPOFF_TO_ID=3) 之后的结果是这样的:TOWN_ID_PK=2, DISTANCE=43, NAME=AIRPORT 然后下一行是 TOWN_ID_PK= 3, DISTANCE=99, NAME= BUS STATION
【解决方案2】:

只是给个提示:

SELECT 
  ORDER_ID, 
  PICKUP_FROM_TOWN_ID, 
  (SELECT DISTANCE FROM TOWN  where TOWN_ID_PK = quotes.DROPOFF_TO_ID) as DISTANCE, 
  quotes.DROPOFF_TO_ID  
from town, quotes 
WHERE quotes.PICKUP_FROM_TOWN_ID=town.TOWN_ID_PK
AND ORDER_ID = '140419420'

这是sqlfiddle

已编辑:

为了得到两行,试试这个:

SELECT 
  ORDER_ID, 
  PICKUP_FROM_TOWN_ID, 
  DISTANCE,
  DROPOFF_TO_ID  
from town, quotes 
WHERE 
    ( quotes.PICKUP_FROM_TOWN_ID=town.TOWN_ID_PK or quotes.DROPOFF_TO_ID=town.TOWN_ID_PK )
AND ORDER_ID = 2

sqlfiddle

【讨论】:

  • 理想情况下,我希望在结果中看到另一行显示 ORDERID=4、DROPOFF_TO_ID=2 和 DISTANCE=43
  • 再次感谢 axel,还有一个问题,我如何区分返回的“距离”之间的差异?例如距离 A= 43,距离 B= 99
  • 数组 ( [quote_id_pk] => 140419432 [pickupfrom_id] => 3 [距离] => 1 [dropoffto_id] => 12) 数组 ( [quote_id_pk] => 140419432 [pickupfrom_id] => 3 [ distance] => 127 [dropoffto_id] => 12 ) 这是我使用 Axel 的答案从我的数据库中获得的结果,这是有效的,但是如何将 $distance1 和 $distance2 设置为两个距离结果?
  • 您想要达到的目标不是很清楚。例如,“下车城市”的“距离”为 43 - 到什么?参见上面的 cmets 。理想情况下,您需要一个表格,列出只有一个距离的所有下车和上车迭代
猜你喜欢
  • 2012-10-15
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2021-03-02
  • 2013-09-27
  • 2014-06-29
  • 2020-12-15
相关资源
最近更新 更多