我在这里有一张桌子:
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;
}
}
}
答案 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