2010-07-10 3 views
-1

J'ai actuellementrequête mysql - sélectionner la valeur distincte où il a une des valeurs spécifiques, groupe par

 
SELECT * FROM bidders 
WHERE status='0' 
AND email IS NOT NULL 
GROUP BY `bid_user` 
ORDER BY 'bid_price' DESC 

Le problème que j'ai est que « bid_user » peut exister dans différentes lignes avec un statut différent (état = 1 ou statut = 0). Je voudrais savoir s'il est possible de sélectionner seulement les * lignes où status = 0 et où bid_user n'existe pas avec status = 1 ainsi que les conditions ci-dessus (ET l'email N'EST PAS NULL GROUP BY bid_user COMMANDER PAR 'bid_price' DESC). Je peux contourner ce problème en utilisant PHP + 2 requêtes mysql mais il serait bien mieux d'avoir la requête exacte dans mysql.

+1

Est-ce que cette requête même travailler? Vous utilisez GROUP BY, mais vous sélectionnez tous les champs, sans fonctions de résumé. –

+0

Je pense que la requête devrait utiliser "count" mais je ne suis pas très familier avec la requête sql donc je ne sais pas comment l'utiliser correctement – Michael

+0

@george La requête fonctionne. J'utilise GROUP BY pour obtenir uniquement des enregistrements avec 'bid_user' distinct et je les commande par 'bid_price' – Michael

Répondre

0

Vous pouvez le faire en remplaçant "status = '0'" état par "status = '0' OR (status = '1' et bid_user IS NULL)"

+0

pouvez-vous s'il vous plaît m'expliquer la syntaxe status = '0' OR (status = '1' AND bid_user IS NULL)? Je ne suis pas sûr si je comprends bien, mais il semble sélectionner les lignes qui ont le statut = 0 ou les lignes qui ont le statut 1 et bid_user "NULL" qui n'est pas ce que je cherche. – Michael

3

Comme vous voulez que les lignes * avec status='0' ET email IS NOT NULL ne pas utiliser GROUP BY

SELECT * FROM bidders 
WHERE status='0' 
AND email IS NOT NULL 
ORDER BY 'bid_price' DESC 

ÉDITÉ (Comme par commentaire de @ Michael)

données

id bid_price bid_user status 
1 100  test  0 
2 200  test  1 
3 300  test2  0 

O/P requis

id bid_price bid_user status 
3 300  test2  0 

SQL Query

SELECT * FROM bidders 
    WHERE bid_user NOT IN (select DISTINCT `bid_user` FROM `bidders` where status='1') 
     AND email IS NOT NULL 
    ORDER BY 'bid_price' DESC 
+0

@salil J'ai oublié d'ajouter que j'utilise GROUP BY pour obtenir des enregistrements basés sur un bid_user unique – Michael

+0

ma question est de savoir comment obtenir des lignes avec un bid_user unique qui ont le statut = 0 mais qui n'existent pas avec status = 1. – Michael

+0

@Michael: - ne pensez-vous pas que bid_user qui a le statut = 0 ne peut pas avoir le statut = 1 comme vous le dites bid_user est unique et si elle a ce moyen bid_user n'est pas unique – Salil

0

Une alternative qui est susceptible de mieux performer en supposant que vous avez des index sur bid_user et status:

SELECT 
    b.* 
FROM 
    bidders b 
WHERE 
    status='0' 
    AND email IS NOT NULL 
    AND not exists (
    select 1 from bidders bx where bx.status='1' and bx.bid_user = b.bid_user 
) 
ORDER BY 'bid_price' DESC 
Questions connexes