如何有效地做这个mysql查询? (加入并检查存在)

时间:2016-03-08 17:16:32

标签: php mysql

我正在做一个mysql查询,我想加入两个表(Projects和Country):

+----------------+  +-------------------------+
| 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)。每个类都是一个包含所有项目ID的表。

  

结构必须是这样的,因为每个类都有其他信息。只有当项目属于该类时,该信息才存在。例如,TO-DO类中的项目具有“start_prevision_date”,该项仅在TO-DO表中有效(来自其他类的字段仍为空)。

我想要做的是为每个项目分配一种颜色,具体取决于他是做什么,做什么还是完成。一个完美的解决方案是返回如下值的查询:

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

可以同时在多个列中

其中1表示他属于,0表示他不属于。我可以检查一下,打印出正确的颜色!

有没有办法有效地做到这一点?避免使用额外的三个查询。

我希望我很清楚。

1 个答案:

答案 0 :(得分: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,否则为null。

我在MySql中测试了一个类似的案例并且有效。

这会给你:

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

如果DOING中的项目也保留在TO-DO中,或者:

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

如果DOING中的项目从TO-DO中删除。

因此,您必须适当地管理结果集上的查询。

此致