2016-07-08 13 views
-2

Ich übe MySQL für eine bevorstehende Prüfung und brauche etwas Hilfe.MySQL Elemente zählen ohne zu zählen (*)

Ich habe diese db:
USER (-Code, Name, Vorname, Alter)
THEATER (Name, Stadt, Kapazität)
Abo (ID, Usercode, TheatreName, Amount)

Mit dieser Referenz Integritätsbedingungen:

SUBSCRIPTION.UserCode-> USER.Code
SUBSCRIPTION.TheatreName-> THEATRE.Name

Für Übung muss ich wr ite die Abfrage, die den Code, den Namen und den Nachnamen der Benutzer, die älter als 50 Jahre alt sind und die mehr als ein Abonnement haben, OHNE die COUNT-Funktion bestimmt.
Ich weiß, dass vielleicht ein Self-Join helfen könnte, aber ich weiß wirklich nicht wie. Kann mir jemand helfen? Vielen Dank.

Antwort

1

können Sie verwenden

EXISTS:

SELECT u.Code, u.Name, u.Surname 
FROM USER u 
WHERE u.Age > 50 
AND EXISTS (
    SELECT 1 FROM SUBSCRIPTION s WHERE u.Code = s.UserCode 
) 

Oder JOIN

SELECT DISTINCT u.Code, u.Name, u.Surname 
FROM USER u 
JOIN SUBSCRIPTION s 
ON u.Code = s.UserCode 
WHERE u.Age > 50 

Edited:

SELECT DISTINCT u.Code, u.Name, u.Surname 
FROM USER u 
JOIN SUBSCRIPTION s1 
ON u.Code = s1.UserCode 
JOIN SUBSCRIPTION s2 
ON u.Code = s2.UserCode 
WHERE s1.ID <> s2.ID 
AND u.Age > 50 
+0

Es tut mir leid, aber ich das nicht verstehen: SELECT 1 FROM Abo s WHERE U.CodE = s.User Code Woher kommt die "1"? – JamieITGirl

+0

"1" ist bedeutungslos, Sie können es durch irgendeine Spalte in der Tabelle 'SUBSCRIPTION' ersetzen, überprüfen Sie das Handbuch von 'EXISTS'. Btw, geht das? – Blank

+0

Ich denke, Sie vermissen den zweiten Punkt der Frage: Ich muss Benutzer auswählen, die älter als 50 sind und mehr als ein Abonnement haben. Ihre Abfragen erfüllen nur die erste Anfrage. – JamieITGirl

1

Ich glaube, der einfachste Weg dies zu tun ist, um die Count-Funktion in eine Summenfunktion mit einer case-Anweisung im wesentlichen Redesign thusly:

SELECT 
    u.NAME 
, u.SURNAME 
, u.CODE 
, SUM(CASE WHEN t.SUBSCRIPTION IS NOT NULL THEN 1 ELSE 0 END) as TOTAL_SUBSCRIPTIONS -- IDENTICAL TO COUNT(s.*) 
, COUNT(s.*) -- SHOULD MATCH THE TOTAL_SUBSCRIPTIONS 
FROM 
USER AS u 
LEFT JOIN SUBSCRIPTION AS s 
ON u.CODE = s.USERCODE 
-- LEFT JOIN THEATRE AS t -- commented because I don't see a requirement for this table to be brought forward. 
-- ON s.THEATRENAME = t.NAME 
WHERE u.AGE > 50 
HAVING SUM(CASE WHEN t.SUBSCRIPTION IS NOT NULL THEN 1 ELSE 0 END) > 1 

ohne einen Fall statment mit:

SELECT 
     u.NAME 
    , u.SURNAME 
    , u.CODE 
    , SUM((select SUM(1) from SUBSCRIPTION WHERE s.USERCODE = u.CODE)) as TOTAL_SUBSCRIPTIONS -- IDENTICAL TO COUNT(s.*) 
    FROM 
    USER AS u 
    WHERE u.AGE > 50 
+0

Danke, aber wir haben die 'case'-Funktion nicht untersucht, also sollten wir das nicht verwenden. Ich glaube, die vorherige Lösung ist, was der Prof. hat in seinem Kopf. – JamieITGirl

+1

Ahh, ich verstehe. Welche anderen Funktionen haben Sie studiert, weil Sie vielleicht erwarten, dass Sie eine dieser Funktionen verwenden? Ich glaube, du könntest auch (Unterabfrage) summieren und die gleiche Antwort bekommen. – Jeff

+0

Wir haben so gut wie alle Grundfunktionen außer den Skalarfunktionen studiert. Also, ja, wir können die SUM verwenden. Vielen Dank. – JamieITGirl