2016-10-04 2 views
0

Ich möchte eine Liste der Filmtitel anzeigen, die mehr als einmal in einem DVD-Shop gemietet wurden. Die ‚Vermietung‘ und ‚Film‘ Tabellen sind aber nicht verbunden sind, wie Sie hier sehen können: http://www.postgresqltutorial.com/wp-content/uploads/2013/05/PostgreSQL-Sample-Database.pngSQL: Gruppieren nach Tabellen, die nicht verbunden sind

Hier ist, was ich bisher habe, was den Fehler verursacht ‚rentCount existiert nicht‘

SELECT title, COUNT(rental_id) AS rentCount 
FROM film f, rental r 
WHERE rentCount >= 1 
GROUP BY title 
ORDER BY rentCount 
+1

Verwenden Sie 'HAVING' anstelle von' WHERE', um Ihr erstes Problem zu lösen. Wenn zwischen diesen Tabellen keine Verbindung besteht, ist Ihre Abfrage nicht sinnvoll. Benutze zumindest Aliase, um zu klären, welche Spalte was bedeutet. –

Antwort

2

(unsicher, welche Art von SQL Sie verwenden, aber in SQL oder MySQL, dies funktionieren soll)

Es scheint, dass der Link von Ihrer film zu rental Tabelle durch Ihren inventory Tisch ist. Verbinden Sie film mit inventory unter Verwendung film_id, dann verbinden Sie inventory zu rental mit inventory_id.

SELECT title, COUNT(rental_id) AS rentCount 
FROM film f 
INNER JOIN inventory i ON i.film_id = f.film_id 
INNER JOIN rental r ON i.inventory_id = r.inventory_id 
HAVING rentCount >= 1 
GROUP BY title 
ORDER BY rentCount 

EDIT: Dank Nicks Punkt aus in den Kommentaren, ich habe mich verändert Ihre WHERE ein HAVING zu sein, der Grund ist, dass Sie eine Aggregatfunktion Spalte verwenden (rentCount).

+0

das hat perfekt funktioniert, danke –

0

Sie brauchen eine HAVING-Klausel:

SELECT f.title, COUNT(*) AS rentCount 
FROM film f 
INNER JOIN inventory i 
ON i.film_id = f.film_id 
INNER JOIN rental r 
ON i.inventory_id = r.inventory_id 
GROUP BY f.title 
HAVING COUNT(*) > 1 
ORDER BY f.title 

Hinweis ich nicht den Alias ​​"rentCount" in dem mit dem Bezug habe.

0

SQL erlaubt nicht die Verwendung des Spaltenalias in der Filterbedingung derselben Abfrage.wenn Sie den Spaltennamen verwenden möchten, müssen Sie als Unterabfrage wie unten verwenden.

SELECT * 
FROM 
    (SELECT title, COUNT(r.rental_id) AS rentCount 
    FROM film f 
     JOIN Inventory I on f.film_id=I.film_id 
    JOIN rental r on l.Inventory_id= r.Inventory_id 
    GROUP BY title)t 
    WHERE rentCount >= 1 
    ORDER BY rentCount 

Sie können auch eine HAVING-Klausel verwenden, wenn Sie eine agrgregate Funktion verwenden und wollten die Filter in der Abfrage machen.

SELECT * 
FROM 
    (SELECT title, COUNT(r.rental_id) AS rentCount 
    FROM film f 
     JOIN Inventory I on f.film_id=I.film_id 
    JOIN rental r on l.inventory_id= r.inventory_id 
    GROUP BY title 
    Having Count(rental_id)>=1)t 
    ORDER BY rentCount 

Denken Sie immer daran, die Kommas Verwenden Sie niemals zu verknüpfen oder Beziehung zwischen dem tables.Write entsprechenden verbindet zu machen und them.In Ihrem Fall verknüpfen, wenn Sie INENER verwenden JOIN gibt es keine Notwendigkeit des Filer-Zustand ‚Wo rentCount> = 1 ', da die Bedingung immer einen wahren Wert zurückgibt. Ich meine, die folgende Abfrage wird Ihnen das gleiche Ergebnis geben wie die anderen.

SELECT title, COUNT(r.rental_id) AS rentCount 
    FROM film f 
     JOIN Inventory I on f.film_id=I.film_id 
     JOIN rental r on l.inventory_id= r.inventory_id 
    GROUP BY title 
Verwandte Themen