2009-10-02 11 views
1

J'ai cette requête sur laquelle je travaille pour un rapport ponctuel. Fondamentalement, ce que j'essaie de faire est de trouver tous les enregistrements où il y a plus de deux transactions par un seul identifiant de compte le mois dernier. Je sais que c'est probablement quelque chose de facile, mon esprit est juste blanking.MySql Count Query

SELECT streaming_transactions.account_id, 
    streaming_transactions_detail.transactions_description, 
    streaming_transactions_detail.transactions_detail_id, 
    streaming_transactions_detail.transactions_id, 
    streaming_transactions_detail.transactions_detail_amount, 
    streaming_transactions_detail.detail_type, 
    streaming_transactions_detail.products_id, 
    streaming_transactions_detail.products_levels_id, 
    streaming_transactions_detail.subscriptions_id, 
    streaming_transactions_detail.subscriptions_payment_options_id, 
    streaming_transactions_detail.modified 
    FROM streaming_transactions_detail 
INNER JOIN streaming_transactions ON streaming_transactions_detail.transactions_id = streaming_transactions.transactions_id 
WHERE streaming_transactions.charged = 1 
    AND streaming_transactions.timestamp_inserted > '2009-09-01 00:00:00' 
    AND streaming_transactions.account_id IN (
       SELECT account_id 
         FROM streaming_transactions_detail 
         WHERE modified > '2009-09-01 00:00:00' 
         AND count(account_id) > 1) 
AND streaming_transactions_detail.transactions_description LIKE '%Service Subscription%' 
ORDER BY streaming_transactions.account_id DESC 
+0

Quel est le problème avec votre requête, êtes-vous obtenir des résultats incorrects ou une erreur? –

+0

Je recevais une erreur. Il semble que vous ne pouvez pas avoir count() dans la clause WHERE, mais dans la clause HAVING –

Répondre

3

Je pense que vous êtes presque là. Le sous-requête pour obtenir la transaction Ids est désactivée, mais

  SELECT account_id 
       FROM streaming_transactions_detail 
       WHERE modified > '2009-09-01 00:00:00' 
       AND count(account_id) > 1) 

- Devrait être quelque chose comme

  SELECT account_id, COUNT(account_id) 
      FROM streaming_transactions_detail 
      WHERE modified > '2009-09-01 00:00:00' 
      GROUP BY account_id 
      HAVING count(account_id) > 1) 



[sans lien] Je vais jeter un soupçon non sollicité sur le style.
En utilisant des alias de table, vous pouvez améliorer la lisibilité de la requête. Cela peut être fait en ajoutant en option "AS xyz" où xyz est un nom court mais mnémonique, propre à cette requête, vous pouvez utiliser xyz n'importe où dans la requête où vous utiliserez la table long_named_table.
Par exemple:

FROM streaming_transactions_detail AS D 

puis

SELECT streaming_transactions.account_id, 
    streaming_transactions_detail.transactions_description, 
    streaming_transactions_detail.transactions_detail_id, 
    ... 

peut-il devenir ("streaming_transactions_detail" le cas échéant, à savoir le fonctionnement encore trop)

SELECT D.account_id, 
    D.transactions_description, 
    D.transactions_detail_id, 
    ... 
+0

C'est exactement ce dont j'avais besoin. Ayant! –

+0

Je comprends parfaitement les alias. C'était une requête jetable pour un rapport ponctuel. Juste en cours d'exécution une fois pour trouver le problème que nous avions. Normalement, la requête aurait été très différente. Mais je l'apprécie vraiment. –