在查询或PHP中处理

时间:2015-09-04 15:28:42

标签: php mysql

我有两个表帐户订单

CREATE TABLE `account` (
   `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
   `name` VARCHAR(50) NULL DEFAULT NULL,
   PRIMARY KEY (`id`)
);
CREATE TABLE `order` (
   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
   `accout_id_1` INT(10) UNSIGNED NOT NULL DEFAULT '0',
   `accout_id_2` INT(10) UNSIGNED NOT NULL DEFAULT '0',
   PRIMARY KEY (`id`)
);

现在我想在订单中获取订单acount_id_1和account_id_2的account.name。

SQL 1

SELECT `order`.id,
   (SELECT account.name FROM account WHERE account.id = order.accout_id_1) AS account_name_1,
   (SELECT account.name FROM account WHERE account.id = order.accout_id_2) AS account_name_2
FROM `order`

SQL 2

SELECT `order`.id, acc_1.name AS account_name_1, acc_2.name AS account_name_2
FROM `order`
JOIN account acc_1 ON acc_1.id = `order`.accout_id_1
JOIN account acc_2 ON acc_2.id = `order`.accout_id_2

使用PHP

SELECT account.id, account.name
FROM account;

SELECT *
FROM `order`;

上面的结果包含在数组中:

$accounts = array(
   1 => 'A',
   2 => 'B'
);

$orders = array(
   0 => array(id => 1, accout_id_1 => 1, accout_id_2 => 1),
   1 => array(id => 2, accout_id_1 => 1, accout_id_2 => 2),
   2 => array(id => 3, accout_id_1 => 2, accout_id_2 => 2)
);

当foreach $ orders 时,我可以在 $ accounts 数组 $ orders.accout_id_1 < / em>, $ orders.accout_id_2

$accounts[$orders[0]['account_id_1']];

使用 SQL 1 SQL 2 使用PHP 。最佳表现如何?

1 个答案:

答案 0 :(得分:2)

通常应该尽量减少必须在SQL Server和PHP之间传递的数据量。如果它们不是在同一台机器上运行,这可能是一个很大的瓶颈,但如果它们位于同一台服务器上,它仍然会有相当大的开销。

因此,尽量在SQL查询中尽可能地做,即SQL 1或SQL 2。

至于在SQL 1和SQL 2之间进行选择,我认为MySQL在优化连接方面通常比相关子查询更好,尽管我听说MySQL的最新版本改进了后者。