0

データベースに対して非常に大きなクエリを実行していますが、何らかの理由で、どの検索語にも一致しない多くの結果が返されます。また、結果が重複しているように見えるため、同じ 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

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を使用して、いくつかの異なる列を 1 つの大きなテキストの山に「結合」することができます。これにより、検索用語を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 に答える
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 に答える