【问题标题】:SQL Query relating to grouping entries与分组条目相关的 SQL 查询
【发布时间】:2014-06-17 09:53:12
【问题描述】:

当我规范化我的数据库时,我使用一个文本值将条目组合在一起,为它们提供相同的外键。但是,在规范化之前,我还有两个其他字段,它们使用参考号将条目组合在一起,一个是成对的条目,一个是成组的条目。由于这些分组条目不一定具有相同的文本值,因此某些条目将被排除在分组之外(共享外键 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 更改为“文本值 123”。

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

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

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

谢谢

【问题讨论】:

  • 这是一个用于创建和填充上表的 SQLFiddle,如果它对其他人有任何帮助:sqlfiddle.com/#!2/ec9b2。遗憾的是我不明白这个问题,所以不能提供更多帮助。

标签: sql phpmyadmin


【解决方案1】:

对于第一部分(选择共享PairRefGroupRef 的所有条目,其中该组中的条目并非都具有相同的ForeignKeyID),可以使用以下查询。它按PairRef 分组并选择具有超过1 个不同ForeignKeyIDPairRefs。然后,选择所有具有这些PairRefs 的条目。同样,数据也按GroupRef 分组。选择具有超过 1 个不同 ForeignKeyID 的所有 GroupRefs。然后,选择所有具有这些GroupRefs 的条目。

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
);

对于第二部分(编辑数据以将它们组合在一起),我不明白您为什么需要从table2 中查看TextValue(如果它对应于table1 中的ForeignKeyID)。无论如何,一旦你看到了PairRefs / GroupRefs,它们有不同的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 的存根。

【讨论】:

  • 我需要查看 table2 中的 TextValue 的原因是我必须查看哪个值是正确的。它们显然不同,因为它们具有不同的 ForeignKeyID。如果没有看到 TextValues,我无法做出选择。有没有办法在第一个查询结束时进行第二个查询,否则我将不得不写下值并开始一个新的查询,这将非常慢。我需要能够快速工作,因为我有 500,000 个条目要分组。在 Access 中工作时,只需单击单元格并更改值即可,但这在 phpMyAdmin 中不起作用。
  • 您好 Joseph B。我正在尝试使用您的第一个查询。请您告诉我在哪里将内连接添加到表 2 中的 TextValue。另外请您解释一下 T1 的含义,因为我之前在 SQL 查询中没有遇到过这个问题。
  • 嗨 Emma,T1 被称为表别名。它只是我们给 Table1 的另一个名称,我们可以使用它来引用 Table1。您可以在 FROM Table1 之后添加 INNER JOIN。我很快就会修改答案。
猜你喜欢
  • 2022-08-13
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多