2014-07-20 9 views
0

Je l'instruction SELECT suivante qui renvoie des données, par exemple ci-dessous:MySQL combiner UPDATE et requête SELECT

SELECT performers.ID, 
     performers.Name, 
     COUNT(*) AS CountOfDeals, 
     COUNT(DISTINCT(deals.Name)) AS CountOfAliases 
    FROM deals RIGHT JOIN performers 
       ON deals.name LIKE CONCAT('%', performers.name, '%') 
WHERE performers.ID IN (27952, 27951, 27950, 27949, 27948) 
GROUP BY Name; 

Exemple de données retournées:

ID  Name    CountOfDeals  CountOfAliases 
27952 Christine Hoberg   1     0 
27951 Indian Jewelry   1     0 
27952 Kinky Friedman   5     3 
27949 KJ-52      1     0 
27960 River Whyless    1     0 

Je veux combiner avec l'instruction UPDATE suivante

UPDATE performers 
    SET RawAliasCount = CountOfAliases, 
     RawDealCount = CountOfDeals 
WHERE ID = ? 

Toutes les valeurs nécessaires pour exécuter l'instruction update sont renvoyées dans l'instruction select ci-dessus alors j'espère que cela devrait être assez facile.

Merci.

+1

Je crois que votre requête ne renvoie pas le résultat nécessaire pour CountOfDeals. Essayez de le vérifier avec une table vide pour les offres, il renvoie 1 toute façon. essayez d'ajouter dans where clause deals.name n'est pas null. – Tata

+1

Et fondamentalement, c'est un tueur de performance pour utiliser JOIN interprètes sur deals.name LIKE CONCAT ('%', performers.name, '%'). Cette jointure effectuera une analyse complète de la table même si vous avez un index sur le champ deals.name. – Tata

+0

Tata, vous pourriez avoir raison, il devrait y avoir des résultats zéro là-bas. Je l'ai récemment modifié et je devrais faire d'autres tests. – pixelkicks

Répondre

4

Utilisation update avec join:

UPDATE performers p JOIN 
     (SELECT performers.ID, performers.Name, COUNT(*) AS CountOfDeals, 
       COUNT(DISTINCT(deals.Name)) AS CountOfAliases 
     FROM deals RIGHT JOIN 
      performers 
      on deals.name LIKE CONCAT('%', performers.name, '%') 
     WHERE performers.ID IN (27952, 27951, 27950, 27949, 27948) 
     GROUP BY Name 
     ) pp 
     ON pp.id = p.id 
    SET RawAliasCount = pp.CountOfAliases, 
     RawDealCount = pp.CountOfDeals; 
0
UPDATE performers 
SET performers.RawAliasCount = count_table.CountOfAliases, performers.RawDealCount = count_table.CountOfDeals 
FROM performers 
     INNER JOIN 
     (
      SELECT 
      performers.ID, performers.Name, COUNT(*) AS CountOfDeals, 
      COUNT(DISTINCT(deals.Name)) AS CountOfAliases 
      FROM deals RIGHT JOIN performers on deals.name LIKE CONCAT('%', performers.name, '%') 
      WHERE performers.ID IN (27952, 27951, 27950, 27949, 27948) 
      GROUP BY Name 
     ) count_table 
ON count_table.ID = performers.ID; 

Quand on demande ce type de question, merci de mettre le schéma des tables.

edit: désolé, c'est la syntaxe sql-server.

+1

Il s'agit de la syntaxe SQL Server, pas de la syntaxe MySQL. –

+0

Vous pouvez le réparer simplement en déplaçant SET après les jointures et en vous débarrassant de FROM. – siride