从一个表中选择包含另一个表

时间:2017-03-03 01:35:25

标签: mysql sql

我创建了一个存储YouTube视频详情的数据库。涉及5个主要表。 video表,channel表,category表,tag表和video_tag表。表格结构如下:

+--------------+    +----------+    +----------+
| video        |    | channel  |    | category |
+--------------+    +----------+    +----------+
| id           |    | id       |    | id       |
| channel_id   |    | title    |    | title    |
| category_id  |    +----------+    +----------+
| title        |
| ...          |
+--------------+

+--------------+    +------+
| video_tag    |    | tag  |
+--------------+    +------+
| video_id     |    | id   |
| tag_id       |    | name |
+--------------+    +------+

我要做的是获取视频标题,频道标题,类别标题和/或标记名称与特定搜索词组匹配的所有视频。我试图使用以下查询来完成此任务:

SELECT DISTINCT v.youtube_id v_youtube_id,
ch.youtube_id ch_youtube_id, ch.title ch_title,
ca.youtube_id ca_youtube_id, ca.title ca_title,
dtl.id dtl_id, dtl.code dtl_code, dal.id dal_id, dal.code dal_code,
v.youtube_date_time_published, v.title v_title, v.description, v.youtube_thumbnail_url, v.duration, v.views_count, v.likes_count, v.dislikes_count
FROM video v
JOIN channel ch ON v.channel_id = ch.youtube_id
JOIN category ca ON v.category_id = ca.youtube_id
LEFT OUTER JOIN language dtl ON v.default_text_language_id = dtl.id
LEFT OUTER JOIN language dal ON v.default_audio_language_id = dal.id
LEFT OUTER JOIN video_tag vt ON v.youtube_id = vt.video_id
LEFT OUTER JOIN tag t ON vt.tag_id = t.id
WHERE ca.youtube_id = 10 AND
v.title LIKE "%jazz%" OR v.title LIKE "%mix%" OR
ch.title LIKE "%jazz%" OR ch.title LIKE "%mix%" OR
ca.title LIKE "%jazz%" OR ca.title LIKE "%mix%" OR
t.name LIKE "%jazz%" OR t.name LIKE "%mix%"

查询中有一个额外的language表,其中大多数时间值为NULL。此外,我知道我在查询条件中使用OR,但我会进行自己的整合,以确保整个查询“jazz mix”在应用程序端匹配。

此查询似乎在匹配搜索短语时大部分工作,但我不确定测试每个结果的最佳方法是什么。无论如何,我面临的问题是,即使我只想获得category = 10的结果,我也得到一些结果,其中类别不是10,我不知道我的错误在哪里查询。

此外,如果您看到任何明显的方法来改进我的查询,请告诉我。

0 个答案:

没有答案