[英]In an SQL statement if nothing is found for a specific query, return an entry
[英]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
在這些領域之一。
您應該在某個地方有加入條件。 然后進行過濾。
您的結果是數據的笛卡爾積,因為您沒有連接條件。 這意味着它將返回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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.