2010-07-24 6 views
1

J'ai une table qui stocke les informations de transaction. Chaque transaction possède une colonne d'identifiant unique (auto incrémentée), une colonne avec le numéro d'identification du client, une colonne appelée bill_paid qui indique si la transaction a été payée par le client avec un oui ou un non, et quelques autres colonnes qui contiennent d'autres informations non pertinentes à ma question. Je veux sélectionner tous les identifiants de client de la table de transaction pour laquelle la facture n'a pas été payée, mais si le client a eu plusieurs transactions où la facture n'a pas été payée, je ne veux pas les sélectionner plus d'une fois. De cette façon, je peux générer une facture de client unique avec toutes les transactions qu'ils doivent au lieu d'une facture séparée pour chaque transaction. Comment pourrais-je créer une requête qui a fait ça pour moi?Sélectionnez les enregistrements pour MySQL une seule fois en fonction d'une valeur de colonne

Répondre

3

retours exactement un customer_id pour chaque client avec bill_paid égal à 'non':

SELECT 
    t.customer_id 
FROM 
    transactions t 
WHERE 
    t.bill_paid = 'no' 
GROUP BY 
    t.customer_id 

Edit:
GROUP BY votre résume ResultSet.
Avertissement: Chaque colonne sélectionnée doit être «groupée par» ou agrégée d'une certaine manière. Comme le montre nikic vous pouvez utiliser SUM pour obtenir le montant total dû, par exemple .:

SELECT 
    t.customer_id 
    , SUM(t.amount) AS TOTAL_OWED 
FROM 
    transactions AS t 
WHERE 
    t.bill_paid = 'no' 
GROUP BY 
    t.customer_id 

t est tout simplement un alias.
Ainsi, au lieu de taper des transactions partout, vous pouvez maintenant taper t. L'alias n'est pas nécessaire ici puisque vous interrogez seulement une table, mais je les trouve inestimables pour les requêtes plus volumineuses. Vous pouvez éventuellement taper AS pour indiquer plus clairement que vous utilisez un alias.

+0

Puisque je ne suis pas un ninja MySQL, est-ce que vous pourriez le décomposer un peu plus pour moi? Plus précisément, que représente le «t»? Aussi, que font les 'transactions '? – ubiquibacon

+0

@typoknig: bien sûr. S'il vous plaît voir modifier. – bernie

+0

Merci, je suis en train de tout mettre ensemble maintenant et il semble que ça va marcher. Laissez-moi vous demander ceci, est-il mal vu d'utiliser PHP pour calculer mes totaux au lieu de la fonction MySQL 'SUM()'? Je veux rester fidèle aux «bonnes pratiques» mais j'ai pensé qu'il serait plus facile de faire mes calculs avec PHP puisque les factures que je génère sont détaillées. – ubiquibacon

0

Vous pouvez essayer l'opérateur Group By, par ex. Groupe par le client.

+1

Merci pour votre réponse, «group by» est ce que je cherchais, mais @Adam Bernier l'a expliqué plus en détail. – ubiquibacon

0
SELECT customer, SUM(toPay) FROM .. GROUP BY customer 
+0

Comment cela exclut-il les colonnes bill_paid = yes? – Konerak

+0

Merci pour votre réponse, mais comme @Konerak l'a fait remarquer, cela ne tient pas compte du statut de 'bill_paid'. – ubiquibacon

Questions connexes