如何从 3 个表中的部分列数据中排序 mysql 查询输出
How to order mysql query output from partial column data in 3 tables
本质上,我正在尝试将来自所有 3 个 table 的 Driver 数据连接到一个输出查询中,通过 mysql 使用来自所述列的数据使用正则表达式组织。
我要解决的问题与输出数据的排序有关。
例如:我有 3 个 table,这 3 个 table 中的每一个都有一个名为 driver 的列,其中包含相同的数据。区别在于 driver 列中的 "driver/index"。
根据这些数据,我计划根据 driver 的喜好重新排列单据和客户信息。
例如
Table |列 |数据
送货单 [Driver] (kevin/1)
PickupSlip [Driver] (kevin/3)
NewCustInfo [Driver] (kevin/2)
输出应该是:
- 送货单
- 新客户信息
- 取件单
而不是:
- 送货单
- 取件单
- 新客户信息
我的代码:
$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 语句。然而,根据我的理解,这似乎只是加入列而不是 tables。我只想根据 NAME/INDEX 对 driver 进行排序,而忽略我正在从 3 个不同的 table 中获取信息这一事实。对这些数据进行排序的最佳方法是什么?
更新:
我开始玩 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
我还需要弄清楚 table 每个项目在完全联合后最初来自哪个项目。我唯一能想到的是将 table 名称插入 Driver 列并用定界符将其分开,以便可以进行 REGEXP。
如何在 select 中添加 table 名称,如下所示:
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
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
这是我确定的代码。
本质上,我正在尝试将来自所有 3 个 table 的 Driver 数据连接到一个输出查询中,通过 mysql 使用来自所述列的数据使用正则表达式组织。
我要解决的问题与输出数据的排序有关。 例如:我有 3 个 table,这 3 个 table 中的每一个都有一个名为 driver 的列,其中包含相同的数据。区别在于 driver 列中的 "driver/index"。
根据这些数据,我计划根据 driver 的喜好重新排列单据和客户信息。
例如
Table |列 |数据
送货单 [Driver] (kevin/1)
PickupSlip [Driver] (kevin/3)
NewCustInfo [Driver] (kevin/2)
输出应该是:
- 送货单
- 新客户信息
- 取件单
而不是:
- 送货单
- 取件单
- 新客户信息
我的代码:
$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 语句。然而,根据我的理解,这似乎只是加入列而不是 tables。我只想根据 NAME/INDEX 对 driver 进行排序,而忽略我正在从 3 个不同的 table 中获取信息这一事实。对这些数据进行排序的最佳方法是什么?
更新:
我开始玩 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
我还需要弄清楚 table 每个项目在完全联合后最初来自哪个项目。我唯一能想到的是将 table 名称插入 Driver 列并用定界符将其分开,以便可以进行 REGEXP。
如何在 select 中添加 table 名称,如下所示:
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
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
这是我确定的代码。