2016-03-08 64 views
0

我做一個MySQL查詢,我要加入兩個表(項目和國家):如何高效地執行此mysql查詢? (加入和檢查存在)

+----------------+ +-------------------------+ 
| Project ID  | | id      | 
+----------------+ +-------------------------+ 
| Name   | | name     | 
+----------------+ +-------------------------+ 
| countryid  | | lat, long (two columns) | 
+----------------+ +-------------------------+ 

我使用這個查詢:

SELECT country.name, country.latitude, country.longitude 
        FROM projects JOIN country ON projects.countryid = country.id; 

精細到現在!接下來會發生的是每個項目都有一個類(TO-DO,DOING,DONE)。每個類都有一個表,其中包含屬於每個類的所有項目標識。

結構必須是這樣的,因爲每個類都有附加信息。只有該項目屬於該類別時,該信息才存在。例如,TO-DO類中的項目具有僅在TO-DO表中有效的「start_prevision_date」(來自其他類的字段仍爲空)。

我想要做的是爲每個項目分配一種顏色,具體取決於他是否要做,做或完成。一個完美的解決方案將是返回值一樣的查詢:

ResultSet: 
+--------------+------------------+-------------------+-------+-------+------+ 
| country.name | country.latitude | country.longitude | TO-DO | DOING | DONE | 
+--------------+------------------+-------------------+-------+-------+------+ 
| Portugal  | 13,4    | 15,6    | 1 | 0 | 0 | 
+--------------+------------------+-------------------+-------+-------+------+ 

可以在多個列一次

1意味着他屬於,0表示不屬於他。我可以檢查並打印正確的顏色!

有沒有辦法有效地做到這一點?避免使用額外的三個查詢。

我希望我很清楚。

+0

爲什麼需要三個額外的查詢?你有所有的信息來決定在PHP中(可能是三個ifs序列)。或者,將TODO,DOING,DONE放在單個字段(可能是ENUM類型)中,因爲它們似乎是相互排斥的。 – syck

+0

我只有這些信息,如果我有正確的查詢... 否則,我會做一個MySQL查詢每支票。 –

+0

請張貼您的完整表格結構 – fusion3k

回答

1

您可以使用這樣的查詢:

SELECT 
country.name, 
country.latitude, 
country.longitude, 
    IF (TO-DO.sureField IS NULL, 0, 1) as TO-DO, 
    IF (DOING.sureField IS NULL, 0, 1) as DOING, 
    IF (DONE.sureField IS NULL, 0, 1) as DONE 
FROM projects 
LEFT JOIN country ON projects.countryid = country.id 
LEFT JOIN TO-DO ON projects.projectid = TO-DO.projectid 
LEFT JOIN DOING ON projects.projectid = DOING.projectid 
LEFT JOIN DONE ON projects.projectid = DONE.projectid; 

sureField必須處於這確實是一個填充,而不是空每個類表中的字段時,一個項目是在該類否則返回null。

我在MySql中測試過重現類似的情況,它的工作。如果在做項目從TO-DO刪除

ResultSet: 
+--------------+------------------+-------------------+-------+-------+------+ 
| country.name | country.latitude | country.longitude | TO-DO | DOING | DONE | 
+--------------+------------------+-------------------+-------+-------+------+ 
| Portugal  | 13,4    | 15,6    | 0 | 1 | 0 | 
+--------------+------------------+-------------------+-------+-------+------+ 

這會給你:

ResultSet: 
+--------------+------------------+-------------------+-------+-------+------+ 
| country.name | country.latitude | country.longitude | TO-DO | DOING | DONE | 
+--------------+------------------+-------------------+-------+-------+------+ 
| Portugal  | 13,4    | 15,6    | 1 | 1 | 0 | 
+--------------+------------------+-------------------+-------+-------+------+ 

如果做的項目還停留在TO-DO,或。

因此,您將不得不適當地管理結果集上的查詢。

Regards

+0

謝謝你的時間。這似乎是解決方案,我會測試它。 –

+0

如果它有效投票我的答案,請。 ;) –