人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP5.1.6 + MySQLでのSQL文についての質問です。
以下の2つのテーブルから配列list1を作りたいのですが、SQL文をどのように書けばよろしいでしょうか?
条件、
・item_tblのuser_idが2
・item_tblとlog_tblのitem_idが重複しないもの
よろしくお願いします。


テーブル名:item_tbl
item_id, user_id, item_name
1, 2, aaa
2, 3, bbb
3, 2, ccc
4, 4, ddd
5, 2, eee
6, 3, fff
7, 2, ddd

テーブル名:log_tbl
item_id, property
2, 111
3, 222
7, 555


配列:list1
item_id, user_id, item_name
1, 2, aaa
5, 2, eee

●質問者: seadwell
●カテゴリ:ウェブ制作
✍キーワード:555 AAA CCC DDD FFF
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● tdoi
●27ポイント

log_tblにitem_idがないitem_tblを列挙するのであれば、こんな感じのサブクエリでいいかと思います。

SELECT
 *
FROM
 item_tbl
WHERE
 item_id NOT IN (SELECT item_id FROM log_tbl)

何かの参考になれば。

◎質問者からの返答

ご回答ありがとうございます。

先ほど動作を確認しました。


2 ● readmaster
●27ポイント

書いてみました。

Accessで恐縮です。MySQLもほぼいけたかと思いますが、

環境がなくてすいません。


select a.item_id, a.user_id, a.item_name

from item_tbl as a LEFT OUTER JOIN log_tbl as b

ON a.item_id = b.item_id

where a.user_id = 2

and b.property IS NULL


期待通りのものが出てくると思います。

ポイントは、外部結合です。

LEFT OUTER JOINというのがそれです。

調べてみると面白いと思いますが、

この場合は、item_tblをもとにして、log_tblをもとに結合します。

その場合、log_tblに存在しないデータも結合するということです。

逆に、内部結合とは、存在するもののみ引っ張ってくるものですね。

最後のWhere句の条件で、 property IS NULLで

データがないものを引っ張ってきています。


おそらく、不等号<>で合致しないということも

考えられたのではないかと思います。

不等号は、該当するレコード以外のものを取得してくるため、

おそらく「期待通り」に動かすのは難しいかもしれません。

今回なら、 item_tbl.item_id <> log_tbl.item_idなんて

書いてしまいそうです。


お役に立てれば。

◎質問者からの返答

なるほど。

LEFT JOIN は何度か使ってわかっていたつもりでしたが、property IS NULL は考え付かなかったですね。

まだ解ってませんでした。

ありがとうございます。


3 ● chuken_kenkou
●26ポイント

MySQLのバージョンを、最低限でMySQL 4.1、5.0、5.1といったレベルまで、提示するようにしてください。大きな機能拡張、一部の仕様変更があります。

どの列で、行を一意に識別できるのでしょうか?

要件は、

  1. user_idが2
  2. item_idで結合
  3. item_tblにあり、log_tblにない行

でいいのでしょうか?


(1)not existsでの例

-- not exists
-- MySQL 4.1 -
select
 *
 from item_tbl as i
 where not exists
 (select 1
 from log_tbl
 where item_id=i.item_id)
 and user_id=2

(2)left joinでの例

MySQLではジョインの実装が先行して行われ、MySQL 4.1でサブクエリを実装したこともあり、「ジョインへの書き換え」を推奨しているケースがあります。

-- left join
-- MySQL 4.1 -
select
 i.*
 from item_tbl as i
 left join log_tbl as l
 on i.item_id=l.item_id
 where user_id=2
 and l.item_id is null
◎質問者からの返答

> MySQLのバージョンを、提示するようにしてください。

以後気をつけます。

どちらも動作を確認しました。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ