0

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

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

4 回答 4

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 中的 AFULLTEXT INDEX可用于将几个不同的列“组合”成一大堆文本,然后您可以在其中MATCH()AGAINST搜索词条。

要创建一个FULLTEXT INDEX,您可以简单地使用此处CREATE INDEX记录的语法。

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

然后,您可以在带有MATCH() ... AGAINST语句的查询中使用它,这些语句在此处记录:

SELECT a.*
FROM j20e8_datsogallery AS a
WHERE MATCH( id, imgtitle, imgtext, imgauthor ) AGAINST( 'bear' )
于 2013-08-28T16:06:22.477 回答
1

它带回了倍数,因为:

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

从它自己的两个表中带回记录的每个组合。所以bear在一个表中连接到另一个表中的每条记录。

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

于 2013-08-28T16:06:06.350 回答
0

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

你应该在某个地方有一个加入条件。然后进行过滤。

于 2013-08-28T16:05:57.413 回答
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
于 2013-08-28T16:07:37.360 回答