如何将表与INNER JOIN进行比较并返回true?

时间:2015-09-21 04:11:26

标签: php mysql

我在这里有一张桌子:

activation
+--------+----------------+
|   id   | activation_code|
+--------+----------------+
|   0001 | 00111          |
|   0002 | 00110          |
|   0003 | 00100          |
+--------+----------------+

和另一张表:

device
+--------+--------------+
|   id   |activation_id |
+--------+--------------+
|   12121| 0001         |
|   12122| 0002         |
|   12123| 0003         |
|   12124| 0004         |
|   12125| 0005         |
+--------+--------------+

我如何获得两个表并比较device.activation_id == activation.id 我想单独列出这些设备,参见示例:

devices
+--------+----------+
| active |inactive  |
+--------+----------+
|   12121| 12124    |
|   12122| 12125    |
|   12123|          |
|        |          |
|        |          |
+--------+----------+

如何在PHP中使用内部关节有一个非常高效的解决方案?

我在这里有一个解决方案,但它不是很好:

foreach ($device_query as $res_d) {
    foreach ($activation_query as $res_a) {
        if ($res_d->activation_id == $res_a->id) {
            $is_active = true;
            break;
        }
        else {
            $is_active = false;
        }
    }
}

4 个答案:

答案 0 :(得分:2)

您可以使用两个单独的SQL查询执行此操作,一个用于获取活动设备,另一个用于获取非活动设备,如此。

主动:

SELECT device.id AS active FROM device INNER JOIN activation ON device.activation_id=activation.id

无效:

SELECT device.id AS inactive FROM device WHERE device.activation_id NOT IN (SELECT id FROM activation)

或者,如果要在一个查询中执行所有操作,可以使用以下查询,并获取一系列包含每个ID和一个布尔值的行,指示其他表是否匹配。

SELECT device.id, device.activation_id IN (SELECT id FROM activation) AS activated FROM device

编辑:如果您还想获取激活码,可以使用以下查询。对于没有激活码的设备,该列在结果集中将为NULL。

SELECT device.id, activation.activation_code FROM device LEFT OUTER JOIN activation ON device.activation_id=activation.id;

答案 1 :(得分:2)

您可以在一个SQL Select中执行此操作,以获取两个设备:

select 
    if(activation_code is not null, d.id, null) as active,
    if(activation_code is null, d.id, null) as inactive,
    activation_code
from device d
left join activation a
    on a.id = d.activation_id

如果您想查看结果:http://sqlfiddle.com/#!9/79abb6/13

答案 2 :(得分:1)

在MySQL级别执行此操作的最有效方法;因为数据库系统在处理数据方面非常有效,与提取数据和处理数据的脚本相比。

一次性完成它会非常麻烦。

您可能想要做这样的事情。

SELECT d.id from FROM activation as a, device as d WHERE a.id = d.activation_id; 

这将获取所有活动设备的列表,在第二个查询中,您可以在有活动设备后过滤其余部分。

答案 3 :(得分:0)

select * 
from db2 d2
left join db1 d1 on d2.id=d1.id