2012-09-19 58 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