mysql找到缺少的项目

时间:2014-06-20 13:14:03

标签: mysql sql

我有一个包含以下结构的表

mysql> describe stock_prices;
+---------------------+-------------+------+-----+---------+----------------+
| Field               | Type        | Null | Key | Default | Extra          |
+---------------------+-------------+------+-----+---------+----------------+
| id                  | int(11)     | NO   | PRI | NULL    | auto_increment |
| code                | varchar(16) | YES  | MUL | NULL    |                |
| pricelist           | varchar(10) | YES  | MUL | NULL    |                |
| settlement_discount | tinyint(1)  | YES  |     | NULL    |                |
| overal_discount     | tinyint(1)  | YES  |     | NULL    |                |
| sale                | tinyint(1)  | YES  |     | NULL    |                |
| price_blob          | longtext    | YES  |     | NULL    |                |
+---------------------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

当我运行此查询时

mysql> SELECT pricelist, count(pricelist) as dup from stock_prices group by pricelist having dup>1 order by dup;
+-----------+------+
| pricelist | dup  |
+-----------+------+
| GMBH      | 1843 |
| DISTCART  | 2241 |
| DISTSTD   | 2241 |
| CART      | 2242 |
| USSD      | 2242 |
| SPCA      | 2242 |
| SPCB      | 2242 |
| SPCC      | 2242 |
| EUCN      | 2242 |
| STD       | 2242 |
| EUSD      | 2242 |
| USCN      | 2242 |
+-----------+------+
12 rows in set (0.03 sec)

所有价格表项目应该具有相同的值,但是少了399个,DISTCART和DISTSTD少了1个。

基本上,我有code没有价格表条目。

我跑的时候:

mysql> SELECT code, count(code) as dup from stock_prices group by code having dup>1 order by dup;
+-------------+-----+
| code        | dup |
+-------------+-----+
| XN44-CH2    |   9 |
| XN23-MGY1   |  11 |
| XN24-CH2    |  11 |
| XN25-VWH1   |  11 |
| XN36-BL2    |  11 |
| XN36-CH3    |  11 |
| XN37-BL3    |  11 |
| XN38-BC3    |  11 |
| XN38-CE3    |  11 |
....

所以在这种情况下,XN44-CH2缺少3个代码而XN23-MGY1缺少1个代码

mysql> SELECT COUNT(pricelist) FROM stock_prices WHERE pricelist = 'GMBH';
+------------------+
| COUNT(pricelist) |
+------------------+
|             1843 |
+------------------+
1 row in set (0.00 sec)

找出每个缺少的价格表是什么的正确方法是什么?

任何建议都非常感激。

1 个答案:

答案 0 :(得分:0)

假设所有价格表都有一个参考表,所有代码都有一个参考表,你可以在标准SQL中做这样的事情:

SELECT
  p.pricelist,
  c.code
FROM
  pricelists AS p
CROSS JOIN
  codes AS c

EXCEPT

SELECT
  pricelist,
  code
FROM
  stock_prices
;

即,获取现有价目表和代码的所有组合,并减去stock_prices中存在的那些组合。结果将是缺失的对。

由于MySQL不支持EXCEPT,您可以使用LEFT JOIN实现相同的逻辑:

SELECT
  p.pricelist,
  c.code
FROM
  pricelists AS p
CROSS JOIN
  codes AS c
LEFT JOIN
  stock_prices AS s ON p.pricelist = s.pricelist
                   AND c.code = s.code
WHERE s.id IS NULL
;

如果您没有这些引用表,则可以用这种方式将它们替换为派生表:

pricelists  ==>  (SELECT DISTINCT pricelist FROM stock_prices)

codes  ==>  (SELECT DISTINCT code FROM stock_prices)

然后查询将如下所示:

SELECT
  p.pricelist,
  c.code
FROM
  (SELECT DISTINCT pricelist FROM stock_prices) AS p
CROSS JOIN
  (SELECT DISTINCT code FROM stock_prices) AS c
LEFT JOIN
  stock_prices AS s ON p.pricelist = s.pricelist
                   AND c.code = s.code
WHERE s.id IS NULL
;