我正在对数据库进行相当大的查询,并且由于某种原因,它返回的许多结果与我的任何搜索字词都不匹配。它似乎也复制了我的结果,所以我得到相同的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%部分有关,但根本无法使其工作。
答案 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)
您的结果是数据的笛卡尔积,因为您没有连接条件。这意味着它返回a
和t
的匹配行的每个组合。
您可能需要这样的事情:
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