我在发出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服务器,因为一切正常......
感谢您的帮助,并对遗失时间表示抱歉: - (
答案 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
答案 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
我希望这很有用。祝你好运。