2014-06-15 4 views
0

Lorsque j'ai normalisé ma base de données, j'ai utilisé une valeur de texte pour regrouper les entrées en leur donnant la même clé étrangère. Cependant, j'avais aussi 2 autres champs avant la normalisation qui utilisaient des numéros de référence pour regrouper les entrées, une en paires d'entrées et une en groupes d'entrées. Étant donné que ces entrées groupées n'ont pas nécessairement la même valeur de texte, certaines entrées auront été exclues du regroupement (ID de clé étrangère partagée).Requête SQL relative au regroupement des entrées

J'ai besoin d'une requête qui sélectionne toutes les entrées qui partagent un PairRef ou un GroupRef où les entrées de ce groupe n'ont pas toutes le même ForeignKeyID.

Exemple:

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' 

Il me faut ensuite pouvoir modifier les données de les regrouper. Le problème est que, pour ce faire, j'aurais besoin que la requête provienne de plus d'une table car j'ai besoin de voir le texte associé à la clé étrangère. J'ai trouvé qu'en utilisant phpMyAdmin, bien que je puisse créer des requêtes à partir de plusieurs tables en utilisant des jointures internes, les résultats de ces requêtes ne peuvent pas être modifiés de la même manière que les requêtes d'une table.

Je suppose que l'alternative serait de faire une requête de mise à jour sur les résultats de la requête. Pourriez-vous donner un exemple d'un moyen rapide et facile de faire une requête de mise à jour sur les résultats de la requête, sans perdre la requête originale qui doit être utilisée à plusieurs reprises. Dans l'exemple ci-dessus, pour le regroupement de ID 1 et ID 2 qui partagent le même PairRef, je devrais physiquement regarder TextValue 123 et 255 et selon lequel était l'étiquette de texte la plus appropriée, je choisirais quelle entrée changer. Disons que la valeur textuelle 123 était la valeur que je voulais conserver pour ce groupe. Je mettrais à jour l'ID 2 vers ForeignKeyID 123, ce qui changerait évidemment automatiquement TextValue pour cette entrée en 'Text value 123'. Pour le regroupement des ID 3 à 8, qui partagent le même GroupRef, si je décidais après avoir regardé les données de les regrouper toutes en tant que 'Text value 201', je changerais les ID 5,6,7 et 8 à ForeignKeyID = 201, ce qui changerait automatiquement tous les TextValues ​​pour ces entrées en 'Text Value 201'.

Les ID 1 à 8 n'apparaîtraient alors plus dans les résultats de la requête car le problème de regroupement aurait été résolu et ils ne répondraient plus aux critères de la requête.

Je dois trouver le moyen le plus simple de le faire, car le regroupement des entrées est l'un des objectifs principaux des bases de données et il y a beaucoup de choses à faire.

Merci

+0

Voici un SQLFiddle pour créer et peupler la table ci-dessus, devrait-il être de toute aide à d'autres: http://sqlfiddle.com/#!2/ec9b2. Malheureusement, je n'ai pas compris la question, donc je ne peux pas être plus utile. – JohnLBevan

Répondre

0

Pour la première partie (sélectionnez toutes les entrées qui partagent un PairRef ou GroupRef où les entrées de ce groupe n'ont pas tous la même ForeignKeyID), la requête suivante peut être utilisée. Il regroupe par PairRef et sélectionne PairRef s qui ont plus de 1 ForeignKeyID distincts. Ensuite, toutes les entrées qui ont ces PairRef sont sélectionnées. De même, les données sont groupées par GroupRef également. Tous les GroupRef s qui ont plus de 1 ForeignKeyID sont sélectionnés. Ensuite, toutes les entrées qui ont ces GroupRef sont sélectionnées.

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

Pour la deuxième partie (modifier les données pour les regrouper ensemble), je ne comprends pas pourquoi vous devez voir le TextValue de table2 (si elle est correspondant à ForeignKeyID dans table1).Quoi qu'il en soit, une fois que vous avez vu les PairRef s/GroupRef s, qui ont des valeurs ForeignKeyID différentes, vous pouvez exécuter une instruction de mise à jour pour chaque PairRef/GroupRef, car il semble être un processus manuel.

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

Vous devrez peut-être exécuter la première requête à nouveau pour vérifier les données, car la requête UPDATE pour GroupRef peut entraîner des valeurs différentes pour PairRef.

Voici un SQL Fiddle demo. Merci, @JohnLBevan pour le talon.

+0

La raison pour laquelle j'ai besoin de voir la TextValue de table2 est que je dois voir quelle valeur est correcte. Ils sont évidemment différents car ils ont des ForeignKeyID différents. Je ne peux pas faire cette sélection sans voir les TextValues. Existe-t-il un moyen de faire la deuxième requête à la fin de la première requête, sinon je devrai écrire les valeurs et commencer une nouvelle requête, ce qui sera très lent. Je dois être capable de travailler rapidement car j'ai 500 000 entrées à grouper. En travaillant dans Access, c'était aussi simple que de cliquer dans la cellule et de changer la valeur, mais ça ne marche pas dans phpMyAdmin. – Emma

+0

Bonjour Joseph B. J'essaie d'utiliser votre première requête. S'il vous plaît pouvez-vous me dire où j'ajouterais la jointure interne à la TextValue de la Table 2. Aussi s'il vous plaît pourriez-vous expliquer ce que T1 signifie que je n'ai pas rencontré cela dans les requêtes SQL avant. – Emma

+0

Salut Emma, ​​T1 s'appelle un alias de table. C'est simplement un autre nom que nous donnons à la Table 1, à l'aide duquel nous pouvons nous référer à la Table1. Vous pouvez ajouter l'INNER JOIN après FROM Table1. Je modifie la réponse sous peu. –

Questions connexes