2012-09-19 30 views
3

我有两个通过外键连接的表。在表A中,我试图获取时间列中的数据大于或等于表B的开始列,并且时间列中的数据小于或等于表格b结束列的所有行。我在想内连接可能会为此工作,但是,结果并不是我所期望的。它正在返回一些数据,但他们正在重复自己。选择条件匹配单行的行吗?

以下是我有:

SELECT * FROM columnA 
INNER JOIN columnB 
ON columnA.time >= columnB.start 
OR columnA.time <= columnB.stop 

上午我在看这个问题?内连接是否是收集这些数据的正确方式?

UPDATE:

其实TABLEA的外键连接到tableB的主键。反正我这样做:

SELECT * FROM tableA 
INNER JOIN tableB 
ON tableA.time >= tableB.start 
AND tableA.time <= tableB.stop 

我之所以没有这样做,你做了什么对上是因为数据已经在数据库几年了,我最近刚刚与外键添加列。所以那个列还没有任何数据。这就是为什么我查询它,所以我可以知道哪些列要更新信息。它将数据返回给我,但还返回了其他不符合要求的数据。

+0

你是说使用AND有帮助,或没有帮助?如果它没有帮助,你能发布一些示例数据,说明出了什么问题,以及你想要的结果吗? – MatBailie

+0

它帮助了,实际上现在我想到了,我问我的问题是错误的。 tableB的第一行有一个开始和结束时间。我想要做的是选择tableA中大于或等于第一行开始时间的时间并且小于或等于同一行的停止时间的数据。对不起,我没有意识到我的问题。 – tylerbhughes

回答

0

我设法弄清楚如此通过添加一个WHERE来匹配我正在查找的确切行中的数据。这里是我的解决方案:

SELECT * FROM tableA 
INNER JOIN tableB 
ON tableA.timetag >= tableB.start 
AND tableA.timetag <= tableB.stop 
WHERE tableB.id = "1" 
1

您必须使用columnName来定义它们的关系,并将条件放在WHERE子句中。 (ON条款

SELECT a.*, b.* 
FROM tableA a 
     INNER JOIN tableB b 
      ON a.colName = b.colName -- colName is the column that links 
WHERE a.`time` >= b.`start` OR  -- both tables. 
     a.`time` <= b.`stop` 
+0

没有要求*将时间条件移到where子句。问题是'OR'。 – MatBailie

+0

查看上面的更新。 – tylerbhughes

1

你需要做你的加入使用外键,然后过滤掉不符合您的条件的结果。

Select * from TableA 
Inner join TableB on TableA.Key = TableB.Key 
Where TableA.time >= TableB.Start 
Or TableA.time <= TableB.Stop 

作为一项规则,我总是保持W3Schools的sql页面近在咫尺。这是我可能已经忘记的SQL函数的最佳快速参考,需要快速回顾一下。也是一个学习的好地方。

+0

[阅读关于w3Schools](http://w3fools.com/) –

+0

@JohnWoo我必须指出,该链接的勘误表均不涉及任何w3schools SQL内容... –

+0

我无法说话他们的任何其他教程,但我记得他们的一些SQL内容中有一些不准确的地方。然而,这是绝大多数的少数人,如果你保持头脑转动,并让F1成为你最好的朋友之一,那么它会比伤害更好。 – 10gistic

0
SELECT a.* 
FROM columnA a 
INNER JOIN columnB b ON a.joiningColumn = b.joiningColumn 
WHERE a.time >= b.start 
OR a.time <= b.stop 
+0

参见上面的更新。 – tylerbhughes

0

从你的问题......

where the data in the time column is greater than or equal to the table B start column 
    AND 
where the data in the time column is less than or equal to the table b end column 

然而,你的查询有...

columnA.time >= columnB.start 
    OR 
columnA.time <= columnB.stop 

与别人的笔记相结合,有关使用外键加入...

SELECT 
    * 
FROM 
    TableA 
INNER JOIN 
    TableB 
    ON TableA.PK = TableB.FK 
    AND TableA.time >= TableB.start 
    AND TableA.time <= TableB.stop 
+0

看到我上面的更新。 – tylerbhughes