我有一些表(大约20个)具有相同的结构,我正在尝试用PHP脚本对它们进行排序,并将它们插入一个新的表中,最便宜的价格在最便宜的1,然后最便宜的2更昂贵......和专栏中最便宜的20:
表格A:
ID
命名
价
表B:
ID
命名
价
表格X:
ID
命名
价
tableResult:
ID
命名
cheapest1
价格1
cheapest2
price2
...
cheapestX
priceX
到目前为止我的代码是:
(SELECT id, price, name FROM tableA WHERE id = $id)
UNION
(SELECT id, price, name FROM tableB WHERE id = $id)
ORDER BY price ASC
我一直在寻找不同的解决方案,但是对于15000行的SELECT需要很长时间,所以我猜还有另一种方法可以做到这一点。 我还没有查找更新查询,我需要在第一次修复select。
有什么建议吗?
编辑:澄清问题,有更多表格
EDIT2:解决方案
我终于做对了。这是选择最便宜的查询: 我选择每个ID,然后浏览:
(SELECT price AS P1, name, id FROM tableA WHERE id = ?) UNION (SELECT price AS P1, name, id FROM tableB WHERE id = ?) UNION (SELECT price AS P1, name, id FROM tableC WHERE id = ?) ORDER BY P1 ASC
然后我按照glglgl建议在新表中插入:
('INSERT INTO table (id, name, Position, price) VALUES (?, ?, ?, ?) ');
答案 0 :(得分:2)
我在Oracle上做过这个,但是MySQL的语法应该非常相似(select应该可以在没有任何更改的情况下工作)。
CREATE TABLE tableA (NAME VARCHAR2(100), price FLOAT);
CREATE TABLE tableB (NAME VARCHAR2(100), price FLOAT);
INSERT INTO tableA VALUES ('a',14.23);
INSERT INTO tableA VALUES ('b',15.23);
INSERT INTO tableA VALUES ('b',16.23);
INSERT INTO tableB VALUES ('a',12.23);
INSERT INTO tableB VALUES ('a',13.23);
INSERT INTO tableB VALUES ('b',9.23);
SELECT name
, max(mxprice) mxprice
, min(mnprice) mnprice
FROM
(
SELECT name
, max(price) mxprice
, min(price) mnprice
FROM tableA
GROUP BY NAME
UNION ALL
SELECT name
, max(price) mxprice
, min(price) mnprice
FROM tableB
GROUP BY NAME
) a
GROUP BY NAME
结果:
NAME MXPRICE MNPRICE
1 a 14.23 12.23
2 b 16.23 9.23
答案 1 :(得分:2)
如果您可以控制表的最终结构:不要这样做。相反,只使用一个表并添加一个字段来指示它所服务的目的。
目标表的结构也不合适。相反,你应该使用
tableResult:
id
name
cheapestorder
cheapest
price
这使得一切变得更容易。
因此,而不是让一行包含
id=10, name=foo, cheapest1=a, cheapestprice1=10, cheapest2=b, cheapestprice2=13,
你有几行
id=10, name=foo, cheapestorder=1, cheapest=a, cheapestprice=10
id=10, name=foo, cheapestorder=2, cheapest=b, cheapestprice=13
(这个过程在数据库理论中被称为“规范化”。)
将所有输入表合并为一个简化dcp's query:
SELECT name,
max(mxprice) mxprice,
min(mnprice) mnprice
FROM
(
SELECT name,
max(price) mxprice,
min(price) mnprice
FROM tableABC
GROUP BY NAME, tbltag
) a
GROUP BY NAME
或者甚至只是
SELECT name,
max(price) mxprice,
min(price) mnprice
FROM tableABC
GROUP BY NAME