【问题标题】:How to order mysql query output from partial column data in 3 tables如何从 3 个表中的部分列数据订购 mysql 查询输出
【发布时间】:2016-02-17 03:45:52
【问题描述】:

本质上,我正在尝试将所有 3 个表中的驱动程序数据连接到一个输出查询中,该查询通过 mysql 使用来自所述列的数据由正则表达式组织。

我要解决的问题与我的输出数据的顺序有关。 例如:我有 3 个表,这 3 个表中的每一个都有一个名为 driver 的列,其中包含相同的数据。区别在于驱动列中的“驱动程序/索引”。

利用这些数据,我计划根据司机的喜好重新排列单据和客户信息。
例如

表           |列    |数据
DeliverySlip    [司机] (kevin/1)
PickupSlip    [司机]   (kevin/3)
NewCustInfo [驱动程序]   (kevin/2)


输出应该是:

  1. 交货单
  2. 新客户信息
  3. PickupSlip

代替:

  1. 送货单
  2. PickupSlip
  3. 新客户信息

我的代码:

$driverget1="Kevin/1"; // this is grabbed through an SQL SELECT statement
$drivername=explode($driverget1,"/");
$tablearray2 = "DeliverySlip|PickupSlip|NewCustInfo";
$table2 = explode("|", $tablearray2);
$Query = "SELECT * FROM `bwa1`.`$table2[0]`,`bwa1`.`$table2[1]`,`bwa1`.`$table2[2]` WHERE `Driver` REGEXP '{$drivername[0]}/' AND `Accomplished`='0' ORDER BY `Driver` REGEXP '/[[:digit:]]' ASC";

当然我得到一个模棱两可的错误。所以,我在考虑使用 JOIN 语句。但是,据我所知,这似乎只是加入列而不是表。我只想根据 NAME/INDEX 对驱动程序进行排序,而忽略我从 3 个不同的表中获取信息的事实。对这些数据进行排序的最佳方法是什么?

更新:

我开始玩 UNION,这就是我一直在寻找的。 下面是一个例子:

SELECT * FROM 
(
  SELECT NewCustInfo.Driver,NewCustInfo.id,NewCustInfo.Accomplished 
        FROM NewCustInfo WHERE NewCustInfo.Driver 
        REGEXP 'Test123/' AND NewCustInfo.Accomplished='0' 
        ORDER BY NewCustInfo.Driver REGEXP '/[[:digit:]]' ASC
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM 
( 
  SELECT PickupSlip.Driver,PickupSlip.id,PickupSlip.Accomplished 
        FROM PickupSlip WHERE PickupSlip.Driver 
        REGEXP 'Test123/' AND PickupSlip.Accomplished='0' 
        ORDER BY PickupSlip.Driver REGEXP '/[[:digit:]]' ASC
) DUMMY_ALIAS2

UNION ALL

SELECT * FROM 
( 
  SELECT DeliverySlip.Driver,DeliverySlip.id,DeliverySlip.Accomplished 
        FROM DeliverySlip WHERE DeliverySlip.Driver 
        REGEXP 'Test123/' AND DeliverySlip.Accomplished='0' 
        ORDER BY DeliverySlip.Driver REGEXP '/[[:digit:]]' ASC
) DUMMY_ALIAS3

在完全并集之后,我仍然需要弄清楚每个项目最初来自哪个表。我唯一能想到的就是将表名插入到 Driver 列中,并用分隔符将其分隔,以便它可以进行 REGEXP。

【问题讨论】:

    标签: php mysql join union


    【解决方案1】:
    SELECT * FROM (SELECT PickupSlip.Driver, 
    SUBSTRING_INDEX(PickupSlip.Driver, '/', -1) AS orderindex, 
    SUBSTRING_INDEX(PickupSlip.Driver, '/', 1) AS thedriver,
    WHERE PickupSlip.Driver 
    REGEXP '{$driverget1}/' 
    AND PickupSlip.Accomplished='0') DUMMY_ALIAS1
    ORDER BY (orderindex+0) ASC
    

    这是我选择的代码。

    【讨论】:

      【解决方案2】:

      如何在 select 中添加表名,如下所示:

      SELECT * FROM  
      (  
          SELECT NewCustInfo.Driver,NewCustInfo.id,NewCustInfo.Accomplished,'NewCustInfo' as tbname
          FROM NewCustInfo WHERE NewCustInfo.Driver 
          REGEXP 'Test123/' AND NewCustInfo.Accomplished='0' 
          ORDER BY NewCustInfo.Driver REGEXP '/[[:digit:]]' ASC
      ) DUMMY_ALIAS1
      
      UNION ALL
      
      SELECT * FROM 
      ( 
          SELECT PickupSlip.Driver,PickupSlip.id,PickupSlip.Accomplished,'PickupSlip' as tbname
          FROM PickupSlip WHERE PickupSlip.Driver 
          REGEXP 'Test123/' AND PickupSlip.Accomplished='0' 
          ORDER BY PickupSlip.Driver REGEXP '/[[:digit:]]' ASC
      ) DUMMY_ALIAS2
      
      UNION ALL
      
      SELECT * FROM 
      ( 
          SELECT DeliverySlip.Driver,DeliverySlip.id,DeliverySlip.Accomplished,'DeliveryShip' as tbname
          FROM DeliverySlip WHERE DeliverySlip.Driver 
          REGEXP 'Test123/' AND DeliverySlip.Accomplished='0' 
          ORDER BY DeliverySlip.Driver REGEXP '/[[:digit:]]' ASC
      ) DUMMY_ALIAS3
      

      【讨论】:

      • 这正是我想要的!谢谢!每天学习新东西!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多