我有一个数据库,由一个类别表,和2个数据表(照片和视频标题)
两个数据表与类别表的关系(即哪些照片和视频属于每个类别)由两个连接表(PHOTO_CATEGORES和VIDEO_CATEGORIES)维护
这个 struct 和一些示例数据可以在这里找到:http://sqlfiddle.com/#!5/197c9/1
并在这里转载:
CREATE TABLE categories(category_id INTEGER PRIMARY KEY, title TEXT NOT NULL);
CREATE TABLE photos(photo_id INTEGER PRIMARY KEY, title TEXT NOT NULL, date_added TEXT NOT NULL, date_last_modified TEXT NOT NULL);
CREATE TABLE videos(video_id INTEGER PRIMARY KEY, title TEXT NOT NULL, date_added TEXT NOT NULL, date_last_modified TEXT NOT NULL);
CREATE TABLE photo_categories(photo_id INTEGER, category_id INTEGER, FOREIGN KEY(photo_id) REFERENCES photos(photo_id) ON DELETE CASCADE, FOREIGN KEY(category_id) REFERENCES categories(category_id) ON DELETE CASCADE);
CREATE TABLE video_categories(video_id INTEGER, category_id INTEGER, FOREIGN KEY(video_id) REFERENCES videos(video_id) ON DELETE CASCADE, FOREIGN KEY(category_id) REFERENCES categories(category_id) ON DELETE CASCADE);
INSERT INTO categories(title) VALUES("Animals");
INSERT INTO categories(title) VALUES("People");
INSERT INTO categories(title) VALUES("Nature");
INSERT INTO categories(title) VALUES("Buildings");
INSERT INTO categories(title) VALUES("Vehicles");
INSERT INTO categories(title) VALUES("Computers");
INSERT INTO photos(title, date_added, date_last_modified) VALUES("Man walking his dog", "2023-01-01", "2023-01-01");
INSERT INTO photos(title, date_added, date_last_modified) VALUES("Bird sat on roof of house", "2023-01-01", "2023-01-01");
INSERT INTO photos(title, date_added, date_last_modified) VALUES("Birds sat in a tree", "2022-01-01", "2022-01-01");
INSERT INTO photos(title, date_added, date_last_modified) VALUES("Car outside house", "2020-01-01", "2020-01-01");
INSERT INTO photos(title, date_added, date_last_modified) VALUES("Couple walking on beach", "2021-01-01", "2021-01-01");
INSERT INTO videos(title, date_added, date_last_modified) VALUES("Horses running", "2022-01-01", "2022-01-01");
INSERT INTO videos(title, date_added, date_last_modified) VALUES("Cars racing", "2022-01-01", "2022-01-01");
INSERT INTO videos(title, date_added, date_last_modified) VALUES("Fish in river", "2022-01-01", "2022-01-01");
INSERT INTO videos(title, date_added, date_last_modified) VALUES("Computer loading", "2020-01-01", "2020-01-01");
INSERT INTO videos(title, date_added, date_last_modified) VALUES("Crowd cheering", "2021-01-01", "2021-01-01");
INSERT INTO photo_categories(photo_id, category_id) VALUES(1, 1);
INSERT INTO photo_categories(photo_id, category_id) VALUES(1, 2);
INSERT INTO photo_categories(photo_id, category_id) VALUES(2, 1);
INSERT INTO photo_categories(photo_id, category_id) VALUES(2, 3);
INSERT INTO photo_categories(photo_id, category_id) VALUES(3, 1);
INSERT INTO photo_categories(photo_id, category_id) VALUES(3, 4);
INSERT INTO photo_categories(photo_id, category_id) VALUES(4, 4);
INSERT INTO photo_categories(photo_id, category_id) VALUES(4, 5);
INSERT INTO photo_categories(photo_id, category_id) VALUES(5, 2);
INSERT INTO photo_categories(photo_id, category_id) VALUES(5, 3);
INSERT INTO video_categories(video_id, category_id) VALUES(1, 1);
INSERT INTO video_categories(video_id, category_id) VALUES(2, 5);
INSERT INTO video_categories(video_id, category_id) VALUES(3, 1);
INSERT INTO video_categories(video_id, category_id) VALUES(3, 3);
INSERT INTO video_categories(video_id, category_id) VALUES(4, 6);
INSERT INTO video_categories(video_id, category_id) VALUES(5, 2);
我有一个查询,它会产生照片数量的计数,以及每个类别下的视频数量的计数,如果适用,包括零. 它的工作原理如下:
SELECT
photos_group.category_id,
photos_group.title,
photos_group.num_of_photos,
videos_group.num_of_videos
from (
select
categories.category_id,
categories.title,
count(photos.photo_id)
AS
num_of_photos
FROM
categories
left JOIN
photo_categories
ON
(photo_categories.category_id = categories.category_id)
left join
photos
ON
(photo_categories.photo_id = photos.photo_id)
GROUP BY
categories.category_id
) photos_group
left join (
select
categories.category_id,
count(videos.video_id)
AS
num_of_videos
FROM
categories
left JOIN
video_categories
ON
(video_categories.category_id = categories.category_id)
left join
videos
ON
(video_categories.video_id = videos.video_id)
GROUP BY
categories.title
) videos_group
on photos_group.category_id = videos_group.category_id;
因此,使用上面的示例数据,这将产生如下正确的结果:
-------------------------------------------------------------------
| category_id | title | num_of_photos | num_of_videos |
-------------------------------------------------------------------
| 1 | Animals | 3 | 2 |
| 2 | People | 2 | 1 |
| 3 | Nature | 2 | 1 |
| 4 | Buildings | 2 | 0 |
| 5 | Vehicles | 1 | 1 |
| 6 | Computers | 0 | 1 |
-------------------------------------------------------------------
我想在此查询中添加一个条件,以计算DATE_ADDED和DATE_MODIFIED字段大于某个值的条目数(包括零
例如,在这些字段为>;=2021-01-1的情况下,结果应返回,
-------------------------------------------------------------------
| category_id | title | num_of_photos | num_of_videos |
-------------------------------------------------------------------
| 1 | Animals | 3 | 2 |
| 2 | People | 2 | 1 |
| 3 | Nature | 2 | 1 |
| 4 | Buildings | 1 | 0 |
| 5 | Vehicles | 0 | 1 |
| 6 | Computers | 0 | 0 |
-------------------------------------------------------------------
但我不清楚在哪里添加WHERE条件,以确保结果表保持上面的 struct ,但计数已更新.
例如,如果我try 在每个SELECT的GROUP_BY之前添加WHERE子句,计数是不正确的,并且也不包括零计数,并且在有照片而不是视频的结果的位置放置一个NULL:
SELECT
photos_group.category_id,
photos_group.title,
photos_group.num_of_photos,
videos_group.num_of_videos
from (
select
categories.category_id,
categories.title,
photos.date_added,
count(photos.photo_id)
AS
num_of_photos
FROM
categories
left JOIN
photo_categories
ON
(photo_categories.category_id = categories.category_id)
left join
photos
ON
(photo_categories.photo_id = photos.photo_id)
where
photos.date_added > 2020-05-01
GROUP BY
categories.category_id
) photos_group
left join (
select
categories.category_id,
count(videos.video_id)
AS
num_of_videos
FROM
categories
left JOIN
video_categories
ON
(video_categories.category_id = categories.category_id)
left join
videos
ON
(video_categories.video_id = videos.video_id)
where
videos.date_added > 2020-05-01
GROUP BY
categories.title
) videos_group
on photos_group.category_id = videos_group.category_id
-------------------------------------------------------------------
| category_id | title | num_of_photos | num_of_videos |
-------------------------------------------------------------------
| 1 | Animals | 3 | 2 |
| 2 | People | 2 | 1 |
| 3 | Nature | 2 | 1 |
| 4 | Buildings | 2 | (null) |
| 5 | Vehicles | 1 | 1 |
-------------------------------------------------------------------
任何关于我如何实现我想要的结果的指导都将不胜感激.谢谢