2014-01-23 88 views
1

我無法進行查詢以獲取某些交叉值。我對mysql的瞭解不太適合做這種事情。帶連接的Mysql查詢

我有兩個表,signedup和signedupLocal。兩者具有相同的字段:名稱,姓氏1,姓氏2,NIF,年份,城市,狀態和日期簽名。

我希望兩個表中的所有值都在狀態爲0時同時按surname1和surname2(A到Z)順序排列。此外,我希望有一個新的字段,例如「app」,它根據數據來自哪個表,說是或否。如果signedpupLocal,yes else no。

之後,我想在狀態爲1的時候按照dateSigned(老的第一個)排序來做同樣的事情。

我還沒有嘗試去測試一個完整的查詢,因爲我只有一部分的問題。

我已經嘗試過類似:

SELECT signedupLocal.name, 
     signedupLocal.surname1, 
     signedupLocal.surname2, 
     signedupLocal.NIF, 
     signedupLocal.year, 
     signedupLocal.city, 
     signedup.name, 
     signedup.surname1, 
     signedup.surname2, 
     signedup.NIF, 
     signedup.year, 
     signedup.city 
FROM signedup, signedupLocal 
WHERE signedup.id_Event = 78 
AND signedupLocal.id_Event = 78 
AND signedupLocal.status = 0 
AND signedup.status = 0 

但它失敗。

+1

「但它失敗了。」意思是什麼? – Matthew

+0

此外沒有連接條件。 – user2989408

+0

所以他會從兩個表中獲得所有行的組合。 –

回答

2
SELECT name, surname1, surname2, NIF, year, city, status, 'no' as app, 
     case when status = 1 then datesigned else '2099-12-31' end as datesigned_sort, 
     case when status = 0 then surname1 else '' end as surname1_sort, 
     case when status = 0 then surname2 else '' end as surname2_sort 
FROM signedup 
WHERE id_Event = 78 AND status in(0,1) 

UNION ALL 

SELECT name, surname1, surname2, NIF, year, city, status, 'yes' as app, 
     case when status = 1 then datesigned else '2099-12-31' end as datesigned_sort, 
     case when status = 0 then surname1 else '' end as surname1_sort, 
     case when status = 0 then surname2 else '' end as surname2_sort 
FROM signedupLocal 
WHERE id_Event = 78 AND status in(0,1) 

ORDER BY 7 asc, 9 desc, 10 asc, 11 asc 

注意事項使用UNION時,你需要在ORDER BY使用列數字,而不是列名。我使用UNION ALL,因爲它比UNION更高效,因爲後者刪除重複項 - 這會導致數據庫引擎的工作量。所以如果你知道沒有,你可以避免這種情況。

對於排序,我使用一個常數的情況下,記錄不應該按排序列排序。

+0

是否可以連接2個連接?我的意思是,我希望status = 0的用戶按姓氏排序,但status = 1的用戶按dateSigned排序。我想我必須做兩個查詢來獲得狀態0和狀態1 – Biribu

+0

@Biribu我編輯我的答案來照顧。 – FrankPl

1

使用2個查詢中的UNION來連接結果。

SELECT * FROM (
SELECT *, "signedup" AS tablename FROM signedup WHERE … 
UNION 
SELECT *, "signedupLocal" AS tablename FROM signedupLocal WHERE … 
) U 
ORDER BY U.dateSigned DESC 
+0

這是行得通的。你知道如何在連接的每個部分添加一個具有不同值的新字段嗎?是/否字段 – Biribu

+0

我剛編輯我的答案。 –

+0

@FabienWarniez您錯過了問題中所述的排序。 – FrankPl