2013-11-27 190 views
1

我試圖在我的網站中建立搜索功能。如果我想搜索,如果照片的標題,文字或標記包含單詞「黑」我有這3個疑問:將3個MySQL查詢合併爲1個查詢

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' 

是否有可能這一切的組合爲1個查詢?我知道我可以加入前兩名,但將第三名與第三名結合起來似乎對我來說太複雜了。我試過加入OR,但我認爲我沒有做對。

此外,我希望它不會有重複的結果,所以如果一張照片的標題爲「黑色」,而標籤爲「黑色」,則只會顯示一次。

BTW表是這個樣子,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  | 
+-------+-------+  
+1

第一查詢搜索標題欄,第二個查詢搜索文本列。我知道這不是很難將兩者合併爲1個查詢,但它是第三個查詢的添加,這使我很困惑 – timsnell

+0

對不起我的錯誤 –

回答

3

看來你應該加入的表,然後由文本你過濾是在尋找兩個表中:

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' 
+1

就是這樣 - 我知道那裏有一個簡單的查詢!我添加了「OR p.text LIKE'%black%'」到WHERE,它的功能就像一個魅力 - 非常感謝 – timsnell

0
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)