我有以下表格结构:

CREATE TABLE a (
 a_id int(10) unsigned NOT NULL AUTO_INCREMENT,
);

CREATE TABLE b {
 b_id int(10) unsigned NOT NULL AUTO_INCREMENT,
};

CREATE TABLE cross (
 a_id int(10) unsigned NOT NULL,
 b_id int(10) unsigned NOT NULL,
 PRIMARY KEY (a_id),
 KEY (b_id),
 CONSTRAINT FOREIGN KEY (a_id) REFERENCES a (a_id),
 CONSTRAINT FOREIGN KEY (b_id) REFERENCES b (b_id)
);

CREATE TABLE prices (
 a_id int(10) unsigned NOT NULL,
 price int(10) NOT NULL,
 PRIMARY KEY (a_id),
 CONSTRAINT FOREIGN KEY (a_id) REFERENCES a (a_id)
);

我想检索每一个有不一致的价格的b}U id值。如果以下条件都成立,则b.id值“b”的价格不一致:
存在两个AyID值(例如,‘A1’和‘A2’),使得表cross包含(A1)、“B”和(‘A2’,‘B’)。(对于任何b_id值,cross中可能有零行或多行)
“A1”和“A2”分别对应具有不同值的prices行,或者“A1”和“A2”中正好有一个对应于price中的条目。
由于宿主提供程序的限制,我无法将存储过程用于此数据库。我还没有找到一种明智的方法来处理SQL查询。到目前为止,我已经在Perl中检索所有相关数据并扫描不一致的地方。那是大量的数据检索。有更好的办法吗?(如果有区别的话,我使用的是InnoDB。)

最佳答案

/* Condition 1 and Condition 2a */
SELECT
    c.b_id
FROM
    `cross` AS c
    JOIN prices AS p ON (p.a_id = c.a_id)
GROUP BY
    c.b_id
HAVING
    COUNT(c.a_id) > 1 AND
    MAX(p.price) != MIN(p.price)

UNION

/* Condition 1 and Condition 2b */
SELECT
    c.b_id
FROM
    `cross` AS c
    LEFT JOIN prices AS p ON (p.a_id = c.a_id)
GROUP BY
    c.b_id
HAVING
    COUNT(c.a_id) > 1 AND
    SUM(IF(p.price IS NULL, 0 ,1)) = 1;

关于mysql - 制定查询以检测不一致的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8480215/

10-16 18:34