对不同表中的相同字段进行排序



我有一些结构相同的表(大约 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

相关内容

  • 没有找到相关文章

最新更新