我有以下表格结构:
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/