みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MySQLでの複数テーブル(4つ)への検索について

はじめまして、こんばんは。
現在、ECサイトを構築中なのですが、MySQLにPHPから検索をかけたいのですが、どうにも詰まってしまったので、投稿させて頂きました。
PHPバージョン:PHP 5.2.6
DBバージョン:MySQL 4.1.22

機能としては、購入履歴から、購入商品のランキングを作りたいと思っております。
ランキング自体の表示はOKなのですが、そこに商品のカテゴリーを表示させたいのです。

関係するテーブルは以下の通りです。
【order】購入履歴テーブル
product_id:商品ID

【products】商品テーブル
product_id:商品ID
name:商品名
image:商品画像

【p_category】商品カテゴリーテーブル
product_id:商品ID
category_id:カテゴリーID

【category】カテゴリーテーブル
category_id:カテゴリーID
category_name:カテゴリー名
parent_category_id:親カテゴリーID

【表示させたい項目】
product_id:商品ID
name:商品名
image:商品画像
category_id:カテゴリーID
category_name:カテゴリー名
parent_category_id:親カテゴリーID

現在のソースは以下の通りです。
---------------------------------------
SELECT
  count(o.product_id) as rank,
  name,
  image,
  p.product_id
FROM
  order as o,
  products as p
WHERE
  o.product_id=p.product_id
GROUP BY
  name,
  image,
  p.product_id
ORDER BY
  rank desc limit 5
---------------------------------------
上記にプラスしたいのは、
p.product_idと【p_category】のproduct_idが一致したcategory_idを取得して、【p_category】のcategory_idと【category】category_idが一致したcategory_name、parent_category_idも取得したいです。

分かりにくいうえに、長文になってしまいましたが、ご指導・ご鞭撻のほど宜しくお願い申し上げます。

投稿日時 - 2008-11-21 21:32:14

QNo.4496993

すぐに回答ほしいです

質問者が選んだベストアンサー

何を言いたいのだろう?
>これで、出来れば、category_idが2か、parent_category_idが0か2のものだけを抽出したいのですが、それが出来ません。
>上記のWHEREに追加で、
>---------------------------------------
>AND category_id=2
>AND parent_category_id IN(0,2)
>---------------------------------------
AND (category_id=2 OR parent_category_id IN(0,2))
こう言う事を言いたかったのですか?

蛇足ですが、テーブル結合をする場合、
サブクエリーを使った方が、場合によっては速くなりますよ。

投稿日時 - 2008-11-22 18:32:16

お礼

ありがとうございます。
表示させたい通りに出来ました。
本当に有難う御座いました。

>AND (category_id=2 OR parent_category_id IN(0,2))
の書き方がわからなかったので、質問させて頂きました。
質問の文章が分かりにくかったようで、申し訳ありませんでした。

ありがとうございました。

投稿日時 - 2008-11-22 21:43:16

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

対照表もテーブル結合に含めてあげるとよいのではないでしょうか。

group by を使用しているみたいなので、集計結果にテーブル結合するとよさそうですね。

投稿日時 - 2008-11-21 22:16:05

補足

一応何とか表示させられるようになりました。
現状は下記の通りです。
---------------------------------------
SELECT
  count(o.product_id) as rank,
  name,
  image,
  p.product_id,
  c1.product_id as c1_id,
  c1.category_id as c1_catid,
  c2.category_id as c2_catid,
  c2.category_name as c2_catname,
  c2.parent_category_id as c2_pcatid

FROM
  order as o,
  products as p
  p_category as c1,
  category as c2

WHERE
  o.product_id=p.product_id
AND o.product_id=c1.product_id
AND c1.category_id = c2.category_id

GROUP BY
  name,
  image,
  p.product_id
  c1.category_id,
  c2.category_id,
  c2.parent_category_id
ORDER BY
  rank desc limit 5
---------------------------------------
これで、出来れば、category_idが2か、parent_category_idが0か2のものだけを抽出したいのですが、それが出来ません。
上記のWHEREに追加で、
---------------------------------------
AND category_id=2
AND parent_category_id IN(0,2)
---------------------------------------
としてみても、ダメでした。
度々恐れ入りますが、ご指導・ご鞭撻のほど宜しくお願い申し上げます。

投稿日時 - 2008-11-22 17:05:59

お礼

アドバイスありがとうございます。
現在試行錯誤中です。

投稿日時 - 2008-11-22 17:05:42

あなたにオススメの質問