php mysql根据另一个表中的冒号值从表1中选择一组列

php mysql根据另一个表中的冒号值从表1中选择一组列,php,mysql,Php,Mysql,我有两张桌子。 表1: deviceID | PartA-present | PartB-present ------------+---------------+--------------- 123 | 0 | 1 254 | 1 | 0 152 | 1 | 1 Table 2: deviceID | PartA-Data | PartB-Data -

我有两张桌子。 表1:

deviceID    | PartA-present | PartB-present
------------+---------------+---------------
123         | 0             | 1
254         | 1             | 0
152         | 1             | 1

Table 2: 
deviceID    | PartA-Data    | PartB-Data
------------+---------------+---------------
123         | 0             | 13
152         | 4             | 25
123         | 0             | 67
152         | 38            | 32
现在,partA、partB等的存在基于用户设置是动态的。如何形成一个查询,以便仅导出表2中存在部件的列(如表1所示)

在这种情况下,对于deviceID=123,我只需要从表2中导出partB数据

编辑

根据我得到的答案,我想我应该澄清一下。我对JOIN有一些想法,但是我不知道如何得到下面的结果

预期结果(适用于deviceID123):

预期结果(对于deviceID 152):

更新


我想要的是根据查询在输出中获得不同数量的列,但多亏了@Alex,我意识到这是不可能的。从这个意义上讲,我可以简单地导出deviceID=xxx bcz的表2,不管怎样,不相关的数据是0。

您的查询应该如下所示:

SELECT table2.*, table1.* 
FROM table2
INNER JOIN table1 ON table1.deviceID = table2.deviceID
WHERE table2.deviceID = 123
AND (table1.PartA-present = 1 OR table1.PartB-present = 1)
这将把两个表连接在一起,并且仅在存在a时返回行

您应该选择表2中存在一个部分的所有条目,然后使用php进行检查

if ($row['PartA-present'] == 1) {
    echo $row['PartA-Data']; 
}
不过,让您的桌子看起来像这样可能更有意义:

Table 2: 
deviceID    | PartA-Data    | PartB-Data
------------+---------------+---------------
123         | -1             | 13
123         | -1             | 25

A-1表示零件不存在。这样,您的查询将更快、更简单,因为您将消除连接,从而增加查询的时间和复杂性。

您的目标不明确。但作为一个起点,试试这把小提琴

编辑1这与table1字段无关,而是与逻辑有关

检查这把小提琴:

这个问题呢

SELECT t1.deviceid,
    IF(t1.partA=1, t2.partA, IF(t1.partB=1,t2.partB,null))
FROM table1 t1
INNER JOIN table2 t2
ON t1.deviceid = t2.deviceid
WHERE t1.deviceID = 123
AND (t1.partA OR t2.partB);
即使它为deviceid=123带来了预期的结果,它是否仍然适用于deviceid=152

编辑2希望我能正确实现你的目标。检查新小提琴:


部分A/B列的存在是否有点像?只有0/1可以存在?@farhangdon是的,始终是0/1即使您进行了编辑,当table2有记录时也不清楚结果应该是什么:
152,13,54
例如?@Alex我显示了两个所需的结果示例,以显示不同的情况。您不能使用mysql在同一查询中显示不同的列数!如果要返回3列-即1个查询,如果要返回2列,则另一个查询!我确实有一个连接的想法,但问题是,我不希望PartA数据表显示,因为PartA present为0。但是您知道deviceid=152的结果表必须是什么样子吗?只需向我显示记录的数据样本和预期结果,如deviceid=152,其中两个值都是1。他不需要选择表1数据。@Alex是的,我相信你达到了我的目标。有没有办法在结果中不包含空列?即,如果table1值为1,则只显示结果中的列?否!使用同一查询无法获得不同数量的列!根据你的帖子,如果只有partA或partB设置为1,你希望有2列,但如果两者都为1,则有3列是不可能的。我确实有一个连接的想法,但问题是,我不希望partA数据表显示,因为partA present为0。查询时,会同时显示partA数据和partB数据。显示是什么意思?您不必向用户“显示”它们-您可以使用php检查值是否不是-1,如果不是,则显示它。是的,我必须这样做,bcz我正在开发一个导出数据功能。所以我只想导出存在部件的行否,我只想从表2中得到表1中“1”的列。这是基于用户预处理的更改,就像我说的,更改数据库格式会更有意义-连接会使查询速度慢得多。
Table 2: 
deviceID    | PartA-Data    | PartB-Data
------------+---------------+---------------
123         | -1             | 13
123         | -1             | 25
SELECT t1.*, t2.*
FROM table1 t1
INNER JOIN table2 t2
ON t1.deviceid = t2.deviceid
WHERE t1.deviceID = 123
AND (t1.partA OR t2.partB)
SELECT t1.deviceid,
    IF(t1.partA=1, t2.partA, IF(t1.partB=1,t2.partB,null))
FROM table1 t1
INNER JOIN table2 t2
ON t1.deviceid = t2.deviceid
WHERE t1.deviceID = 123
AND (t1.partA OR t2.partB);
SELECT t1.deviceID,
  IF(t1.partA=1, t2.partA, null),
  IF(t1.partB=1, t2.partB, null)
FROM table1 t1
INNER JOIN table2 t2
ON t1.deviceid = t2.deviceid
WHERE t1.deviceID = 123
AND (t1.partA OR t2.partB);