2017-12-20 1 views
0

Ziemlich neu in mySQL. Versuchen, eine Abfrage zum Funktionieren zu bringen, erhalten aber immer die richtigen Ergebnisse, aber dupliziert.MySQL Query gibt doppelte Ergebnisse zurück

Hier ist die Abfrage

SELECT DISTINCT 
    band.band_name, concert.venue_name 
FROM 
    band, concert 
WHERE 
    concert.date="2012-10-17" AND band_name 
IN 
    (SELECT band.band_name FROM band WHERE band.band_id 
IN 
    (SELECT tour.band_id from tour where tour.tour_name 
IN 
    (SELECT tour_name from concert where concert.date="2012-10-17"))); 

DDL:

CREATE TABLE band (
    band_id  INT, 
    band_name VARCHAR(50), 
    genre  VARCHAR(20), 
    PRIMARY KEY (band_id)); 

CREATE TABLE musician (
    person_id INT, 
    name  VARCHAR(50), 
    band_id  INT, 
    PRIMARY KEY (person_id), 
    FOREIGN KEY (band_id) REFERENCES band(band_id)); 

CREATE TABLE tour(
    tour_name VARCHAR(50), 
    band_id  INT, 
    PRIMARY KEY (tour_name), 
    FOREIGN KEY (band_id) REFERENCES band(band_id)); 

CREATE TABLE venue(
    venue_name VARCHAR(30), 
    hire_cost INT, 
    PRIMARY KEY (venue_name)); 

CREATE TABLE concert(
    concert_id  INT, 
    date    DATE, 
    tour_name  VARCHAR(50), 
    venue_name  VARCHAR(30), 
    ticket_sales  INT, 
    PRIMARY KEY  (concert_id), 
    FOREIGN KEY  (tour_name) REFERENCES tour(tour_name), 
    FOREIGN KEY  (venue_name) REFERENCES venue(venue_name)); 

ich total verloren bin. Jede Hilfe würde sehr geschätzt werden.

+0

Ja. Siehe über JOINs. Jedes Anfängerbuch oder Tutorial würde tun. – Strawberry

+0

Ich bin überrascht, dass eine distinct-Klausel keine Duplikate entfernt. Können Sie Beispieldaten zu Ihrer Frage als Text hinzufügen? –

Antwort

1

Tabellen beizutreten ist der Weg zu gehen, Sie türmen nicht alle Bedingungen in die where Klausel:

SELECT DISTINCT 
    b.band_name, c.venue_name 
FROM concert c 
    join venue v on v.venue_name = c.venue_name -- thats how those 2 tables connect 
    join tour t on t.tour_name = c.tour_name -- thats how those 2 tables connect 
    join band b on b.band_id = t.band_id  -- thats how those 2 tables connect 
WHERE c.date="2012-10-17"    -- and this gives you all the bandnames and 
          -- venuenames that play on every concert on this date 

diese Weise wird die DB Abfrage optimieren können und aufgrund der schließt sich auf den Tischen nicht braucht um so viele Daten zu scannen.

Verwandte Themen