我有两个表帐户,订单:
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 。最佳表现如何?
答案 0 :(得分:2)
通常应该尽量减少必须在SQL Server和PHP之间传递的数据量。如果它们不是在同一台机器上运行,这可能是一个很大的瓶颈,但如果它们位于同一台服务器上,它仍然会有相当大的开销。
因此,尽量在SQL查询中尽可能地做,即SQL 1或SQL 2。
至于在SQL 1和SQL 2之间进行选择,我认为MySQL在优化连接方面通常比相关子查询更好,尽管我听说MySQL的最新版本改进了后者。