1

我有一些具有相同结构的表(大约 20 个),我正在尝试使用 php 脚本对它们进行排序,并将它们插入到一个新表中,其中最便宜的价格是最便宜的 1,然后是最便宜的 2 更贵......最贵的在最便宜的列中:

表A: id
名称
价格

表B: id
名称
价格

表 X: id
名称
价格

表结果: id
名称
最便宜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 行需要很长时间,所以我想还有另一种方法可以做到这一点。我还没有找更新查询,我需要在第一时间修复选择。

有什么建议吗?

编辑:澄清问题,有更多表格

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 (?, ?, ?, ?) ');
4

2 回答 2

2

我在 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
于 2012-06-01T21:30:52.983 回答
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 的查询

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

.

于 2012-06-02T10:36:05.943 回答