与查询分组相关的SQL查询

时间:2014-06-15 20:00:29

标签: sql phpmyadmin

当我规范化我的数据库时,我使用文本值将条目组合在一起,为它们提供相同的外键。但是,在规范化之前我还有2个其他字段,它们使用参考号将条目组合在一起,一个用于条目对,一个用于条目组。由于这些分组条目不一定具有相同的文本值,因此某些条目将被排除在分组之外(共享外键ID)。

我需要一个查询,选择共享PairRef或GroupRef的所有条目,其中该组中的条目都不具有相同的ForeignKeyID。

示例:

ID    PairRef     GroupRef ForeignKeyID    TextValue (in linked table2)
1     25          25       123             'Text value 123'
2     25          25       255             'Text value 255'
3     1           50       201             'Text value 201'
4     1           50       201             'Text value 201'
5     2           50       202             'Text value 202'
6     2           50       202             'Text value 202'
7     3           50       203             'Text value 203'
8     3           50       203             'Text value 203'

然后,我需要能够编辑数据以将它们组合在一起。问题是,为了做到这一点,我需要查询来自多个表,因为我需要查看与外键关联的文本。我发现使用phpMyAdmin,虽然我可以使用内部联接从多个表创建查询,但是这些查询的结果无法按照来自一个表的查询的方式进行编辑。

我想替代方法是对查询结果进行更新查询。您能举例说明一种快速简便的查询结果更新查询方法,而不会丢失需要重复使用的原始查询。

在上面的例子中,对于重新组合共享相同PairRef的ID 1和ID 2,我需要物理地查看TextValue 123和255并且根据哪个是更合适的文本标签,我将决定哪个进入改变。假设“文本值123”是我想要为该分组保留的值。我会将ID 2更新为ForeignKeyID 123,这显然会自动将该条目的TextValue更改为“Text value 123”。

对于重新组合共享相同GroupRef的ID 3到8,如果我在查看数据后将其全部重新分组为“文本值201”,我会更改ID 5,6,7和8到ForeignKeyID = 201,它会自动将这些条目的所有TextValues更改为“Text Value 201”。

ID 1到8将不再出现在查询结果中,因为分组问题已经解决,并且它们将不再符合查询条件。

我需要找到最简单的方法来实现这一点,因为将条目组合在一起是数据库的主要目的之一,并且还有很多这样的编辑要做。

谢谢

1 个答案:

答案 0 :(得分:0)

对于第一部分(选择共享PairRefGroupRef的所有条目,其中该组中的条目不都具有相同的ForeignKeyID),可以使用以下查询。它按PairRef分组,并选择PairRef个,其中ForeignKeyID超过1个PairRef。然后,选择具有这些GroupRef的所有条目。同样,数据也按GroupRef分组。选择了具有多于1个不同ForeignKeyID的所有GroupRef个。然后,选择具有这些SELECT T1.* FROM Table1 T1 INNER JOIN Table2 T2 ON T1.ForeignKeyID = T2.ForeignKeyID WHERE PairRef IN ( SELECT PairRef FROM table1 GROUP BY PairRef HAVING Count(DISTINCT ForeignKeyID) > 1 ) OR GroupRef IN ( SELECT GroupRef FROM table1 GROUP BY GroupRef HAVING Count(DISTINCT ForeignKeyID) > 1 ); 的所有条目。

TextValue

对于第二部分(编辑数据以将它们组合在一起),我不明白为什么您需要查看来自table2的{​​{1}}(如果它与ForeignKeyID相对应在table1)。无论如何,一旦您看到具有不同PairRef值的GroupRef s / ForeignKeyID,您就可以为每个PairRef / GroupRef运行更新语句,因为它看起来像是一个手动过程。

UPDATE Table1
SET ForeignKeyID = <ForeignKeyID to be set>
WHERE PairRef = <PairRef to update>;

UPDATE Table1
SET ForeignKeyID = <ForeignKeyID to be set>
WHERE GroupRef = <PairRef to update>;

您可能需要再次运行第一个查询来检查数据,因为GroupRef的UPDATE查询可能会导致PairRef的值不同。

这是 SQL Fiddle demo 。谢谢@JohnLBevan的存根。