※ ChatGPTを利用し、要約された質問です(原文:SELECT文で重複せずに取得するには?)
SELECT文で重複せずに取得するには?
2014/02/13 11:34
このQ&Aのポイント
商品情報を格納したテーブルと店舗毎の情報を格納したテーブルのJOINを使って、検索文字列で商品名とタグを検索してヒットした商品番号を重複なしに取得したいです。
SELECT文にはLEFT JOINを使用し、複数の条件をORで結合することで重複せずに取得できます。
具体的なSELECT文の例として、((タグが検索文字列のどれかと一致している)または(商品名が検索文字列の全ての語を含んでいる))という条件を使用します。
SELECT文で質問があります。
商品情報を格納したテーブルを作成し、「商品名を検索するとその商品番号を取得する」という単純なSELECTですがうまくいきません。
■tb_items → 商品情報を格納しています。
--------------------------------------------
商品番号 サイズ 重さ
001 50 120
002 30 200
--------------------------------------------
■tb_details → 店舗毎の情報を格納しています。
--------------------------------------------
商品番号 店舗番号 商品名 価格
001 shop_A シャープデジカメ 50000
001 shop_B シャープcamera 56000
002 shop_A パナソニックスマホ 85000
002 shop_B Panasonicスマホ 79000
--------------------------------------------
ここで、「商品名を検索するとその商品番号を取得できる」としたいのですが、例えば「シャープ」で検索すると商品番号001を取得できますが、「sharp」で検索すると当然ですが商品番号001は取得できません。
そこでタグのようなものを登録するテーブルをさらに作成しました。
■tb_tags
--------------------------------------------
タグ 商品番号
sharp 001
カメラ 001
スマートフォン 002
携帯 002
--------------------------------------------
試しに「sharp カメラ」を検索してみました。SELECT文は以下のようにしました。
--------------------------------------------
SELECT
tbI.`商品番号`
FROM
tb_items AS tbI
LEFT JOIN
tb_details AS tbD ON tbI.`商品番号` = tbD.`商品番号`
LEFT JOIN
tb_keywords AS tbK ON tbI.`商品番号` = tbK.`商品番号`
WHERE
(
((tbK.`タグ` = 'sharp') OR (tbK.`タグ` = 'カメラ')) OR
(
(tbD.`商品名` LIKE '%sharp%') AND (tbD.`商品名` LIKE '%カメラ%')
)
)
--------------------------------------------
取得した結果は、
001
001
というように同じ商品番号を重複して2つ取得してしまいます。
検索を「シャープ camera」にしても重複して2つ取得してしまいます。
やりたいことは、「検索文字列(空白区切りあり)で商品名とタグを検索してヒットした商品番号を重複なしに取得したい」です。
どのようなSELECT文にすれば良いのでしょうか?
お手数ですがアドバイスを頂けたらと思います。
どうぞよろしくお願い致します。
質問の原文を閉じる
質問の原文を表示する
お礼
ありがとうございます! 実はDISTINCTは試していて、これを使うと取得数が0になってしまっていました。 しかしどうやら私のDISTINCTの使い方が間違っていて今DISTINCTを使って書き直したら重複する情報がうまく一つにまとまってくれました。 ↓うまくできた書き方 SELECT DISTINCT(tbI.`商品番号`) AS itemNo FROM … ↓間違った書き方 SELECT DISTINCT(tbI.`商品番号` AS itemNo) FROM …