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)

有了这些数据,它应该过滤掉 obj 1,因为它没有选项 3,并且过滤掉 obj 3,因为它没有日期 22。

结果:

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

要获得具有相同日期的对象和用户的结果,您需要将这两者挂钩:

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 回答