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

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/05/05 22:36:11
  • 終了:2011/05/09 11:44:26

回答(3件)

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752011/05/06 00:04:24

ポイント27pt

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

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

何かの参考になれば。

id:seadwell

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

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

2011/05/06 23:50:25
id:readmaster No.2

readmaster回答回数74ベストアンサー獲得回数52011/05/06 01:31:22

ポイント27pt

書いてみました。

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なんて

書いてしまいそうです。


お役に立てれば。

id:seadwell

なるほど。

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

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

ありがとうございます。

2011/05/07 00:41:47
id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542011/05/06 01:39:19

ポイント26pt

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
id:seadwell

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

以後気をつけます。

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

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

2011/05/09 11:44:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません