SQL:按未连接的表分组
我想显示一个电影名称的列表,这些电影名称在DVD商店被租了不止一次。“租赁”和“电影”表没有连接,但您可以在此处看到: 这是我到目前为止得到的,它给出了错误“rentCount不存在”SQL:按未连接的表分组,sql,Sql,我想显示一个电影名称的列表,这些电影名称在DVD商店被租了不止一次。“租赁”和“电影”表没有连接,但您可以在此处看到: 这是我到目前为止得到的,它给出了错误“rentCount不存在” SELECT title, COUNT(rental_id) AS rentCount FROM film f, rental r WHERE rentCount >= 1 GROUP BY title ORDER BY rentCount (不确定您使用的是哪种SQL,但是在SQL或MySQL中,这应该
SELECT title, COUNT(rental_id) AS rentCount
FROM film f, rental r
WHERE rentCount >= 1
GROUP BY title
ORDER BY rentCount
(不确定您使用的是哪种SQL,但是在SQL或MySQL中,这应该可以正常工作)
从电影
到租赁
表的链接似乎是通过库存
表进行的。使用film\u id
将film
加入inventory
,然后使用inventory\u id
将inventory
加入rental
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
编辑:感谢Nick在评论中指出的,我已经将您的WHERE
更改为have
,原因是您使用的是聚合函数列(rentCount
)。(不确定您使用的是哪种SQL,但在SQL或MySQL中,这应该有效)
从电影
到租赁
表的链接似乎是通过库存
表进行的。使用film\u id
将film
加入inventory
,然后使用inventory\u id
将inventory
加入rental
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
编辑:感谢Nick在评论中指出的,我将您的
WHERE
更改为HAVING
,原因是您使用的是聚合函数列(rentCount
)。您需要HAVING子句:
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
注意,我没有在HAVING中引用别名“rentCount”。您需要HAVING子句:
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
请注意,我没有在have中引用别名“rentCount”。SQL将不允许在同一查询的筛选条件中使用列别名。如果要使用列名,则需要像下面这样作为子查询使用
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
如果您使用的是aggregate函数,并且希望在查询中进行筛选,那么也可以使用HAVING子句
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
请始终记住,永远不要使用逗号来链接或建立表之间的关系。编写适当的连接并链接它们。在您的情况下,如果使用Inner连接,则不需要文件服务器条件“Where rentCount>=1”,因为该条件将始终返回真值。我的意思是,下面的查询将给你和其他查询一样的结果
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
SQL将不允许在同一查询的筛选条件中使用列别名。如果要使用列名,则需要将其用作子查询,如下所示
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
如果您使用的是aggregate函数,并且希望在查询中进行筛选,那么也可以使用HAVING子句
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
请始终记住,永远不要使用逗号来链接或建立表之间的关系。编写适当的连接并链接它们。在您的情况下,如果使用Inner连接,则不需要文件服务器条件“Where rentCount>=1”,因为该条件将始终返回真值。我的意思是,下面的查询将给你和其他查询一样的结果
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
而不是WHERE
来解决初始问题。如果这些表之间没有链接,那么您的查询就没有意义。至少要使用别名来说明哪一列是什么意思,用HAVING
而不是WHERE
来解决您最初的问题。如果这些表之间没有链接,那么您的查询就没有意义。至少要使用别名来说明哪列表示什么