多个连接在具有不同列的同一个表上

时间:2013-02-15 16:59:53

标签: mysql sql join

我在发出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服务器,因为一切正常......

感谢您的帮助,并对遗失时间表示抱歉: - (

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

更改行

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

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

在文本字段中处理日期有点棘手(也是不好的做法)。确保两个日期的格式相同。

答案 2 :(得分: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

我希望这很有用。祝你好运。