簡體   English   中英

SQL特定語句查詢

[英]SQL Specific Statement Query

我正在對數據庫進行很大的查詢,由於某種原因,它返回的結果與我的任何搜索詞都不匹配。 它似乎也重復了我的結果,所以我得到了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%部分有關,但根本無法正常工作。

我會確保您有資格參加。 否則,您將得到完全聯接,或更糟糕的是,來自交叉聯接的笛卡爾積。 遵循以下原則:

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 ...,它可以將所有這些列組合到一個索引中,並使所有這些列的搜索功能正常。

一個FULLTEXT INDEX在MySQL能夠被用來“合並”幾個不同的列到一個大的一堆文字,這可以再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' )

它帶回倍數,因為:

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

自己從兩個表中帶回記錄的所有組合。 所以bear在一個表連接到另一個表中的每個記錄。

您需要指定表之間的關系,最好使用顯式的JOIN

你有兩個表,這意味着在每一行之間的交叉連接a將在每一行被加入t ,而且正如我在我的評論說,你會得到每一個有記錄bear在這些領域之一。

您應該在某個地方有加入條件。 然后進行過濾。

您的結果是數據的笛卡爾積,因為您沒有連接條件。 這意味着它將返回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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM