2016-03-08 61 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

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