将3个MySQL查询组合成1个查询

将3个MySQL查询组合成1个查询,mysql,sql,select,Mysql,Sql,Select,我正试图在我的网站上建立一个搜索功能。如果我想搜索照片的标题、文本或标签是否包含“黑色”一词,我有以下3个查询: SELECT id FROM photos WHERE title LIKE '%black%' AND status = 'A' SELECT id FROM photos WHERE text LIKE '%black%' AND status = 'A' SELECT DISTINCT(photos.id) FROM photos, photo_tags, t

我正试图在我的网站上建立一个搜索功能。如果我想搜索照片的标题、文本或标签是否包含“黑色”一词,我有以下3个查询:

SELECT id 
FROM photos 
WHERE title LIKE '%black%' 
AND status = 'A'

SELECT id 
FROM photos 
WHERE text LIKE '%black%' 
AND status = 'A'

SELECT DISTINCT(photos.id) 
FROM photos, photo_tags, tags 
WHERE tags.tag LIKE '%black%' 
AND photo_tags.keyid = tags.id 
AND photos.id = photo_tags.catid 
AND photos.status = 'A'
是否可以将所有这些合并到一个查询中?我知道我可以加入前两个,但是把它和第三个结合起来对我来说太复杂了。我曾尝试加入或,但我认为我做得不对

此外,我希望它没有重复的结果,所以如果一张照片的标题是“黑色”和标签是“黑色”,它只会出现一次

顺便说一句,表看起来像这样,keyid与tag.id相关,catid与photos.id相关

photos

+----+-----------+-----------------+
| id | title     | text            |
+----+-----------------------------+
|  1 | blue pic  | black and blue  |
|  2 | red pic   | red and green   |
|  3 | green pic | green and white |
|  4 | white pic | white and black |
|  5 | black pic | black and gold  |
+----+-----------+-----------------+

tags

+----+-------+
| id | tag   |
+----+-------+
|  1 | blue  |
|  2 | table |
|  3 | chair |
|  4 | red   |
|  5 | black |
+----+-------+

photo_tags

+-------+-------+
| keyid | catid |
+-------+-------+
|  1    | 1     |
|  2    | 1     |
|  3    | 2     |
|  4    | 2     |
|  5    | 5     |
+-------+-------+    

似乎您应该加入这些表,然后根据在两个表中查找的文本进行筛选:

SELECT DISTINCT p.id FROM photos p
JOIN photo_tags pt ON pt.cat_id = p.id
JOIN tags t ON pt.key_id = t.id
WHERE (p.title LIKE '%black%' OR t.tag LIKE '%black%') AND p.status = 'A'

第一个查询是搜索标题列,第二个查询是搜索文本列。我知道将这两个查询合并成一个查询并不太困难,但这是第三个查询的添加,这让我很困惑——我知道有一个简单的查询!我在WHERE中添加了“或类似于“%black%”的p.text,它就像一个符咒一样有效-非常感谢
First statement could be your answer. Not sure if you are looking for below output:-

ysql> SELECT DISTINCT(photos.id) FROM photos, photo_tags, tags WHERE tags.tag L
IKE '%black%'AND photos.title LIKE '%black%' AND photo_tags.keyid = tags.id AND
photos.id = photo_tags.catid;
+------+
| id   |
+------+
|    5 |
+------+
1 row in set (0.05 sec)


mysql> SELECT id
    -> FROM photos
    -> WHERE title LIKE '%black%' ;
+------+
| id   |
+------+
|    5 |
+------+
1 row in set (0.08 sec)

mysql> SELECT id
    -> FROM photos
    -> WHERE text LIKE '%black%';
+------+
| id   |
+------+
|    1 |
|    4 |
|    5 |
+------+
3 rows in set (0.00 sec)

mysql> SELECT DISTINCT(photos.id)
    -> FROM photos, photo_tags, tags
    -> WHERE tags.tag LIKE '%black%'
    -> AND photo_tags.keyid = tags.id
    -> AND photos.id = photo_tags.catid ;
+------+
| id   |
+------+
|    5 |
+------+
1 row in set (0.05 sec)



mysql> SELECT DISTINCT(photos.id) FROM photos, photo_tags, tags WHERE tags.tag L
IKE '%black%'AND photos.title LIKE '%black%' AND photo_tags.keyid = tags.id AND
photos.id = photo_tags.catid;
+------+
| id   |
+------+
|    5 |
+------+
1 row in set (0.05 sec)