2017-07-05 4 views
-1

mein Tisch:Auswählen alle Zeilen mit nur einem Wert in der Spalte mit einem anderen gemeinsamen Wert

drop table if exists new_table; 
create table if not exists new_table(
    obj_type int(4), 
    user_id varchar(30), 
    payer_id varchar(30) 
); 

insert into new_table (obj_type, user_id, payer_id) values 
    (1, 'user1', 'payer1'), 
    (1, 'user2', 'payer1'), 
    (2, 'user3', 'payer1'), 
    (1, 'user1', 'payer2'), 
    (1, 'user2', 'payer2'), 
    (2, 'user3', 'payer2'), 
    (3, 'user1', 'payer3'), 
    (3, 'user2', 'payer3'); 

Ich all Zahler-ID, dessen obj_type ist nur ein Wert wählen versuche und keine andere Werte. Mit anderen Worten, obwohl jeder Zahler mehrere Benutzer hat, möchte ich nur die Zahler, die nur einen obj_type verwenden.

Ich habe versucht, eine Abfrage wie folgt aus:

select * from new_table 
    where obj_type = 1 
    group by payer_id; 

Aber diese Zeilen zurück, auch deren Zahler haben andere Benutzer mit anderen obj_types. Ich versuche, ein Ergebnis zu erhalten, das wie folgt aussieht:

obj | user | payer 
----|-------|-------- 
3 | user1 | payer3 
3 | user2 | payer3 

Vielen Dank im Voraus.

+0

Beitrag ein Beispiel von dem, was Ihr Ausgangs sollte sein. – justiceorjustus

Antwort

1

, die eigentlich einfach:

SELECT player_id 
FROM new_table 
GROUP BY player_id 
HAVING COUNT(DISTINCT obj_type) = 1 

Filter Reihen zu haben wie WHERE aber es tut dies nach der Aggregation.

Der Unterschied wird am besten durch ein Beispiel erläutert:

SELECT dept_id, SUM(salary) 
FROM employees 
WHERE salary > 100000 
GROUP BY dept_id 

Dies Sie die Summe der Gehälter der Menschen geben sich mehr als 100.000 verdienen. Die zweite Abfrage gibt Ihnen die Abteilungen, in denen alle Mitarbeiter zusammen mehr als 100000 verdienen, auch wenn kein einzelner Mitarbeiter so viel verdient.

+0

Danke, aber ich fürchte, das bekommt nicht, was ich brauche. Wenn es mehrere obj_types mit jeweils unterschiedlichen Benutzern aber einer gemeinsamen Zahler-ID gäbe, möchte ich nur die Zahler, die ONE obj_type in meiner Beispiel-Info haben. Ich habe die erste Abfrage ausprobiert, die Sie erwähnt haben, aber es werden Zeilen ausgewählt, die mehrere obj_types enthalten können. – sarcastasaur

+0

Verstanden Now- dies gearbeitet: 'select * from new_table \t Gruppe von payer_id \t mit count (distinct obj_type) = 1 \t und obj_type = 3;' – sarcastasaur

+0

„Gäbe es mehrere obj_types, die jeweils mit unterschiedlichen Benutzern, sondern ein common payer id, ich möchte nur die zahler, die ONE obj_type in meinem beispiel info haben. " Genau das ist meine Abfrage. Es gibt eine Zeile mit "payer3" zurück. – fhossfel

1

Wenn Sie alle Zeilen zurückgeben, ohne sie gruppieren können Sie analytische Funktionen verwenden:

SELECT * FROM (
    SELECT obj_type,user_id, 
     payer_id, 
     COUNT(DISTINCT obj_type) OVER (PARTITION BY payer_id) AS distinct_obj_type 
    FROM new_table) 
WHERE distinct_obj_type = 1 

Oder Sie können oben mit der Abfrage vorhanden sein:

SELECT * 
FROM new_table 
WHERE payer_id IN (SELECT payer_id 
        FROM new_table 
        GROUP BY payer_id 
        HAVING COUNT(DISTINCT obj_type) = 1) 
Verwandte Themen