SQL特定语句查询

时间:2013-08-28 16:00:43

标签: mysql sql

我正在对数据库进行相当大的查询,并且由于某种原因,它返回的许多结果与我的任何搜索字词都不匹配。它似乎也复制了我的结果,所以我得到相同的SQL项目16次。有什么想法吗?

SELECT a.*
FROM
  j20e8_datsogallery AS a,
  j20e8_datsogallery_tags AS t
WHERE
  (a.id LIKE "%bear%" OR
   a.imgtitle LIKE "%bear%" OR
   a.imgtext LIKE "%bear%" OR
   a.imgauthor LIKE "%bear%" OR
   t.tag LIKE "%bear%")
ORDER BY a.id DESC
LIMIT 0, 16

我认为这可能与LIKE%term%部分有关,但根本无法使其工作。

4 个答案:

答案 0 :(得分:3)

我确保您符合加入条件。否则,您将最终获得完全加入,或者更糟糕的是,来自交叉连接的笛卡尔积。这些方面的东西:

SELECT a.*
FROM
j20e8_datsogallery AS a
JOIN j20e8_datsogallery_tags AS t ON a.ID = t.GalleryID
WHERE
...
ORDER BY a.id DESC
LIMIT 0, 16

另外,考虑使用FULLTEXT INDEX ...它可以将所有这些列组合成一个索引,并且可以使所有这些列的搜索功能完全正常。

MySql中的FULLTEXT INDEX可用于将多个不同的列“合并”为一大堆文本,然后您可以MATCH()AGAINST搜索字词。

要创建FULLTEXT INDEX,您只需使用CREATE INDEX语法记录here

CREATE FULLTEXT INDEX FDX_datsogallery 
ON j20e3_datsogallery ( id, imgtitle, imgtext, imgauthor )

然后,您可以在包含MATCH() ... AGAINST语句的查询中使用它,这些语句已记录为here

SELECT a.*
FROM j20e8_datsogallery AS a
WHERE MATCH( id, imgtitle, imgtext, imgauthor ) AGAINST( 'bear' )

答案 1 :(得分:1)

它带回了倍数,因为:

SELECT a.*
FROM j20e8_datsogallery AS a, j20e8_datsogallery_tags AS t

将两张表中记录的 记录的每个 组合带回来。因此,一个表中的bear连接到另一个表中的每个记录。

您需要指定表之间的关系,最好使用明确的JOIN

答案 2 :(得分:0)

您在两个表之间有一个交叉连接,这意味着a中的每一行都将与t中的每一行连接,正如我在评论中所说,您将获得每条记录在其中一个字段中有bear

你应该在某处加入条件。然后进行过滤。

答案 3 :(得分:0)

您的结果是数据的笛卡尔积,因为您没有连接条件。这意味着它返回at的匹配行的每个组合。

您可能需要这样的事情:

SELECT a.*
FROM
  j20e8_datsogallery AS a,
  INNER JOIN j20e8_datsogallery_tags AS t ON a.id = t.a_id --(or whatever the foreign key is)
WHERE
  (a.id LIKE "%bear%" OR
   a.imgtitle LIKE "%bear%" OR
   a.imgtext LIKE "%bear%" OR
   a.imgauthor LIKE "%bear%" OR
   t.tag LIKE "%bear%")
ORDER BY a.id DESC
LIMIT 0, 16