在mysql中按标签和标题搜索

时间:2013-03-11 16:56:47

标签: mysql search

我想通过标题或标签搜索我的数据库程序和新闻我在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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

为了更好的可读性(以及更容易调试),我已经改写了SELECT以使用JOINS(另外我在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,但您需要提供更多详细信息才能进行该调用。