2012-03-20 48 views
0

我是MYSQL的新手。我試圖編寫一個查詢來跨多個表進行搜索,但它似乎只評估查詢的第一個條件。我已經開發了查詢:多表查詢

SELECT DISTINCT user.user_id, user_netid, user_firstname, user_lastname, 
    user_dmid, user_insnum, instype_id, user_birthday, user_insapproved 
FROM user, signup, event 
WHERE (user.instype_id = 3 OR user.instype_id = 4) 
    AND signup.signup_attended =1 AND signup.signup_timestamp >= 1325376000 
    AND (event.activity_id=37 OR event.activity_id=40 OR event.activity_id=5); 

我知道這是很長,但就像我說的,我是新來這個,這是我能拿出最好的。無論如何,它似乎只評估user.instype_id,因爲它給了我signup.signup_attended!= 1或user.instype_id後面出現的任何其他條件的記錄。有人可以告訴我我做錯了什麼嗎?

+2

您應該將查詢重寫爲正確的連接類型語法。現在你從3個表中選擇,但沒有指定表之間的任何關係,所以你以笛卡爾連接結束,這會給你帶來很多不好的結果。 – 2012-03-20 15:36:14

+0

歡迎來到Stack Overflow!我總是希望提醒新用戶,通過點贊(一旦獲得20點聲望點)並接受答案(答案旁邊的複選標記),表示讚賞的方法就是通過。如果您有任何疑問,請參考[常見問題],特別是[問] – 2012-03-20 16:19:58

回答

0

我的猜測是,這是由於你的交叉連接(帶有逗號表的列表,但沒有連接語句)。基本上,你可以用inst類型過濾掉用戶,但你仍然會向用戶顯示一個signup_attended,因爲user表和signup表沒有鏈接,所以它只是開始將這些表拼接在一起。也許wikipedia can explain a cross join better than I can :)

你需要使用JOIN

這裏來重寫你的代碼是它會是什麼樣子之後(與猜測連接列)

SELECT DISTINCT user.user_id, user_netid, user_firstname, user_lastname, 
    user_dmid, user_insnum, instype_id, user_birthday, user_insapproved 
FROM user 
    JOIN signup 
     ON signup.user_id = user.id 
    JOIN event 
     ON event.signup_id = signup.id 
WHERE (user.instype_id = 3 OR user.instype_id = 4) 
    AND signup.signup_attended =1 AND signup.signup_timestamp >= 1325376000 
    AND (event.activity_id=37 OR event.activity_id=40 OR event.activity_id=5); 

在SQL執行谷歌加入一個例子你應該得到一個很好的信息解釋這一點。 Here is one tutorial

+0

好的,這樣做更有意義。謝謝。我用這種格式重寫了我的查詢。然而,現在只有一條記錄被發現,而且我知道肯定有不止一條記錄符合這些條件。我試圖擺脫「DISTINCT」,但得到了同樣的結果。 – thuey 2012-03-20 16:00:04

+0

現在看起來是這樣的: SELECT user.user_id,user_netid,user_firstname,user_lastname, user_dmid,user_insnum,instype_id,user_birthday,user_insapproved 從用戶 JOIN註冊 ON signup.user_id = user.user_id JOIN時間表 ON註冊.schedule_id = schedule.schedule_id JOIN事件 ON event.event_id = schedule.event_id WHERE(用戶。AND(event.activity_id = 37或event.activity_id = 40或event.activity_id = 5);以及(或)user.instype_id = 4) AND signup.signup_attended = 1 AND signup.signup_timestamp> = 1325376000 – thuey 2012-03-20 16:03:31

+2

查詢本身現在看起來很健康。你將不得不在你的問題中提供一些示例數據,使用SQLFiddle.com(這對於設置多個表格可能很困難),或者在調試類似問題時使用的方法是開始刪除過濾器一個接一個,直到獲得更多結果。這至少會告訴你過濾器過於嚴格。這包括使一些JOIN語句變爲LEFT JOIN,因爲它可能是在這裏過於嚴格的JOIN。谷歌LEFT JOIN應該澄清它如何做,如果你不確定:) – 2012-03-20 16:18:38

0

有幾件事情需要在這裏修復。您正在訪問的每個值都需要與表關聯。你的第一個值「user.user_id」有效,但其餘的不與表相關聯(如果這是有意義的)。

您能否提供您正在使用的表格的佈局。

0

無論是使用語法:

select * from user 
join signup on user.userPrimaryKey=signup.userForeignKey 
where conditions... 

或:

select * from user,signup 
where user.userPrimaryKey=signup.userForeignKey AND condition... 

像馬克·乙說你做一個笛卡兒連接(一個表的每一行都會聯想到另外一個表中的所有行)