我有一些结构相同的表(大约 20 个),我正在尝试使用 php 脚本对它们进行排序并将它们插入一个新表中,价格最便宜 1,然后最便宜 2 更贵...... 和列中最贵的最便宜20:
表 A:编号
名字
价格
表 B:编号
名字
价格
表十:编号
名字
价格
表结果:编号
名字
最便宜1
价格1
最便宜2
价格2
...
最便宜的X
价格X
到目前为止,我的代码是:
(SELECT id, price, name FROM tableA WHERE id = $id)
UNION
(SELECT id, price, name FROM tableB WHERE id = $id)
ORDER BY price ASC
我一直在寻找不同的解决方案,但是选择 15000 行需要很长时间,所以我想还有另一种方法可以做到这一点。我还没有寻找更新查询,我需要在第一次修复选择。
有什么建议吗?
编辑:澄清的问题,更多表格
编辑2:解决方案
我终于做对了。这是选择最便宜的查询:我选择每个 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 (?, ?, ?, ?) ');
如果您可以控制表的最终结构:不要这样做。相反,仅使用一个表并添加一个字段来指示它的用途。
目标表的结构也不太好。相反,您应该使用
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 的查询:
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
.
我在Oracle上做了这个,但是MySQL的语法应该非常相似(选择应该无需任何更改即可工作)。
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