0

SQLリクエストの作成に問題があります。

これが私のテーブルです:

CREATE TABLE dates(  
  id INT PRIMARY KEY, 
  obj_id INT,
  dispo_date  text 
);  

CREATE TABLE option(
  id INT PRIMARY KEY, 
  obj_id INT,
  random_option INT
);

CREATE TABLE obj(  
  id INT PRIMARY KEY, 
);

そして、ユーザーが私に与えるランダムな日付といくつかのオプション。

両方のテーブルで、日付がユーザーの日付と等しいobjに対応するすべてのものを選択したいと思います。

DATE = "22/01/2013"、OPTIONS=3としましょう。

SELECT * FROM obj 
INNER JOIN dates
ON dates.obj_id=obj.id
INNER JOIN option
ON option.obj_id=obj.id
WHERE dates.dispo_date="22/01/2013"
AND option.random_option=3;

これにより、objテーブルのすべてが、それぞれについて、何もフィルタリングせずに同じ日付とオプションで取得されます。

誰かが私が間違っていることについていくつかの指針を教えてもらえますか?

解決:

誰もが私が探していたものを手に入れているようだったので、SQLサーバーを再起動してから、すべてが機能します...

あなたの助けに感謝し、時間の損失をお詫びします:-(

4

3 に答える 3

2

私が見る限り、クエリに問題はありません。

試してみると、対応する日付と対応するオプションがあるobj行のみが返されます。

insert into dates values
(1, 1, '22/01/2013'),
(2, 1, '23/01/2013'),
(3, 2, '22/01/2013'),
(4, 2, '23/01/2013'),
(5, 3, '23/01/2013'),
(6, 3, '24/01/2013');

insert into `option` values
(1, 1, 4),
(2, 1, 5),
(3, 2, 3),
(4, 2, 4),
(5, 3, 3),
(6, 3, 4);

insert into obj values
(1),
(2),
(3)

このデータでは、オプション3がないためobj 1を除外し、日付22がないためobj3を除外する必要があります。

結果:

ID  OBJ_ID  DISPO_DATE  RANDOM_OPTION
-------------------------------------
2   2       22/01/2013  3

デモ:http ://sqlfiddle.com/#!2 / a398f / 1

于 2013-02-15T17:17:14.897 に答える
1

あなたのラインを変更します

WHERE dates.dispo_date="22/01/2013"

にとって

WHERE DATE(dates.dispo_date)="22/01/2013"

テキストフィールドで日付を処理するのは少し注意が必要です(これも悪い習慣です)。両方の日付が同じ形式であることを確認してください。

于 2013-02-15T17:08:22.793 に答える
1

まず、どのIDがどのテーブルにマップされているかについて少し混乱しています。DATESのidフィールドの名前をdate_idに、OPTIONのidの名前をoption_idに、objのidをobj_idに変更することをお勧めします。鍵穴から覗き込む人々にとって、これらの関係を非常に明確にします。私はあなたの関係を正しく理解していることを確認するために少し円を描いて行きます。その上で、私はあなたの問題を誤って理解しているかもしれません。

あなたはobj.id->dates.obj_idとoption.obj_id->dates.obj_idを持っていると思うので、それに基づいて、クエリはもう少し複雑にする必要があると思います。

これにより、オブジェクトの日付がわかります。

Select *
  from obj obj
  join dates d
    on obj.id=d.obj_id

これにより、ユーザーの日付がわかります。

select *
  from option o
  join dates d
    on o.obj_id=d.obj_id

同じ日付のオブジェクトとユーザーの結果を取得するには、次の2つをフックする必要があります。

select * 
  from (Select *
          from obj obj
          join dates d
            on obj.id=d.obj_id) a
  join (select *
          from option o
          join dates d
            on o.obj_id=d.obj_id) b
    on a.dispo_date=b.dispo_date
 where b.random=3

これがお役に立てば幸いです。幸運を。

于 2013-02-15T17:09:17.823 に答える