2013-03-11 54 views
0

我想在我的DB計劃和按標題或標籤新聞搜索標籤和標題搜索我有這樣的代碼在MySQL:通過在MySQL

Select * 
    from promociones,promocion_tag,programa_tag,tags,programas 
    WHERE tags.nombre='STH' 
    AND tags.id=programa_tag.id_tag 
    AND programa_tag.id_programa=programas.id 
    OR tags.nombre='STH' 
    AND tags.id=promocion_tag.id_tag 
    AND promocion_tag.id_promocion=promociones.id 
    OR promociones.titulo LIKE "%STH%" 
    OR programas.titulo LIKE "%STH%" 

你看到任何錯誤?由於其返回一些錯誤,在同一行多次..


表(重要的列): 計劃成 -ID -Titulo

的Promociones -ID -Titulo

- 標籤 -ID -Nombre

Programa_tag -id_tag -programa_tag

Promocion_tag -id_tag -promocion_tag

+0

添加連接。圍繞應該用'OR'分隔的標準放置括號。 – Tom 2013-03-11 17:02:05

回答

1

您需要使用由於括號的AND然後OR的優先級。使用明確的JOIN語法也是有幫助的。

... 
AND tags.id=programa_tag.id_tag 
AND (programa_tag.id_programa=programas.id 
OR tags.nombre='STH') 
AND tags.id=promocion_tag.id_tag 
AND (promocion_tag.id_promocion=promociones.id 
OR promociones.titulo LIKE "%STH%" 
OR programas.titulo LIKE "%STH%") 

See the documentation

0

爲了更好的可讀性(更容易調試),我已經改寫您選擇使用連接(加我加了周圍的OR表達括號:

SELECT * FROM tags 
JOIN programa_tag ON tags.id=programa_tag.id_tag 
JOIN programas ON programa_tag.id_programa=programas.id 
JOIN promocion_tag ON promocion_tag.id_tag = tags.id 
JOIN promociones ON promociones.id = promocion_tag.id_promocion 
WHERE tags.nombre='STH' AND 
(promociones.titulo LIKE "%STH%" OR programas.titulo LIKE "%STH%") 

沒有關於進一步認識你的數據庫我只能猜測JOIN是否實際上應該是LEFT JOINS,而且這個SELECT實際上可能需要一個UNION,但是你需要提供更多的細節來完成這個調用。

+1

另外,你的'LIKE'%STH%'搜索子句將會非常慢。 – 2013-03-11 17:07:32

+0

什麼推薦? – 2013-03-11 17:32:49

+0

@Ollie Jones同意了。當您匹配以通配符開頭的字符串時,MySQL將無法使用任何索引。因此,執行「LIKE」%WHATEVER「」對性能不利。 – Hazzit 2013-03-11 17:32:52