将两个表加入一个没有交叉数据的表

时间:2015-07-20 15:24:28

标签: php mysql

我需要一个建议,如何做得更好。

我有两张桌子'shop'和'office'。它们都有列'ad_id'但不相互交叉。我需要得到商店广告和办公室广告的总和。 如何做得更好:

  • 进行两次查询并在php中总结
  • 进行一次查询并在mysql中总结

只要我知道我无法通过左连接或类似方式加入他们,因为他们没有交叉数据,所以我只能这样做:

SELECT count(*) + (SELECT count(*) FROM shop) FROM office

如何做得更好?有没有办法做得更好,如果没有 - 哪一个应该更快?

2 个答案:

答案 0 :(得分:2)

如何做得更好? 让数据库做好数学运算

有没有办法做得更好或者如果没有 - 哪一个应该更快? 通常,在通过网络传输不必要的数据或呼叫之前,在数据库中进行基于集合的处理是最佳的。

这样简单应该有用......(在mySQL中)

  SELECT (select sum(amt) from shop) + (select sum(amt) from office)

工作示例:SQL FIDDLE

它将使用shop_ads和office ads列从办公室和商店返回所有记录的总和,将结果一起添加并返回1个数字。

答案 1 :(得分:1)

进行速度测试:

create table a2
(
    r int not null
);

DELIMITER $$
CREATE procedure jamInRandom ()
BEGIN
    declare iCount int;
    set iCount=1;
    WHILE iCount<=100 DO
        insert a2(r) values (rand()*424+1);
        set iCount=iCount+1;
    END WHILE;
    set iCount=1;
    WHILE iCount<=6 DO
        insert into  a2(r) select r from a2;
        set iCount=iCount+1;
    END WHILE;

END $$
DELIMITER ;

call jamInRandom(); -- call stored proc

select count(*) from a2;    -- 6400 rows (100 random)
select count(*) as theCount,sum(r),avg(r),min(r),max(r) from a2;

+----------+---------+----------+--------+--------+
| theCount | sum(r)  | avg(r)   | min(r) | max(r) |
+----------+---------+----------+--------+--------+
|     6400 | 1279360 | 199.9000 |      6 |    424 |
+----------+---------+----------+--------+--------+
1 row in set (0.01 sec)

现在尝试在php循环中设置秒表

-- clean up:
-- drop procedure jamInRandom;
-- drop table a2;

将最后一次循环从6改为10,然后我得到:

+----------+----------+----------+--------+--------+
| theCount | sum(r)   | avg(r)   | min(r) | max(r) |
+----------+----------+----------+--------+--------+
|   102400 | 21538816 | 210.3400 |     11 |    424 |
+----------+----------+----------+--------+--------+
1 row in set (0.07 sec)