Php 如何将同一mySQL表中的多个数据左键联接?

Php 如何将同一mySQL表中的多个数据左键联接?,php,mysql,left-join,Php,Mysql,Left Join,这是我的桌子位置: 这是我的餐桌上的人: 我从mySQL数据库发出的请求 $pdo = $db->query(' SELECT *, position.id AS id, people.id AS people_id FROM position LEFT JOIN people ON position.teacher=people.id; ON position.cook=people.id; ON position.doctor=people.id; ON position.den

这是我的桌子位置:

这是我的餐桌上的人:

我从mySQL数据库发出的请求

$pdo = $db->query('
SELECT *, position.id AS id, people.id AS people_id 
FROM position 
LEFT JOIN people 
ON position.teacher=people.id;
ON position.cook=people.id;
ON position.doctor=people.id;
ON position.dentist=people.id;
');

while ($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
echo "The teacher is "$row['firstname']." ".$row['name'];
echo "The cook is "$row['firstname']." ".$row['name'];
echo "The doctor is "$row['firstname']." ".$row['name'];
echo "The dentist is "$row['firstname']." ".$row['name'];
}
我的结果是:

The teacher is Ben Harper
The cook is Ben Harper
The doctor is Ben Harper
The dentist is Ben Harper
我需要的结果是:

The teacher is Ben Harper
The cook is Samanta Jones
The doctor is Emiliy Rose
The dentist is Fred Miller
试试这个

$pdo = $db->query('
SELECT *, position.id AS id, people.id AS people_id,
(case when position.teacher <> '' then 'teacher'
when position.cook <> '' then 'cook'
when position.doctor <> '' then 'doctor' 
when position.dentist <> '' then 'dentist') position_name
FROM position 
LEFT JOIN people 
ON position.teacher=people.id;
ON position.cook=people.id;
ON position.doctor=people.id;
ON position.dentist=people.id;
');

while ($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
echo "The ".$row['position_name']." is "$row['firstname']." ".$row['name'];
}
试试这个

$pdo = $db->query('
SELECT *, position.id AS id, people.id AS people_id,
(case when position.teacher <> '' then 'teacher'
when position.cook <> '' then 'cook'
when position.doctor <> '' then 'doctor' 
when position.dentist <> '' then 'dentist') position_name
FROM position 
LEFT JOIN people 
ON position.teacher=people.id;
ON position.cook=people.id;
ON position.doctor=people.id;
ON position.dentist=people.id;
');

while ($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
echo "The ".$row['position_name']." is "$row['firstname']." ".$row['name'];
}

如果你重组你的桌子会更好

+----+------------+ | id | position | +----+------------| | 1 | teacher | | 2 | cook | | 3 | doctor | | 4 | dentist | +----+------------+ +----+-----------+--------+-----+-------------+ | id | firstname | name | age | position_id | +----+-----------+--------+-----+-------------+ | 1 | Fred | Miller | 42 | 4 | | 2 | Emily | Rose | 32 | 3 | | 3 | Ben | Harper | 38 | 1 | | 4 | Samanta | Jones | 35 | 2 | +----+-----------+--------+-----+-------------+
如果你重组你的桌子会更好

+----+------------+ | id | position | +----+------------| | 1 | teacher | | 2 | cook | | 3 | doctor | | 4 | dentist | +----+------------+ +----+-----------+--------+-----+-------------+ | id | firstname | name | age | position_id | +----+-----------+--------+-----+-------------+ | 1 | Fred | Miller | 42 | 4 | | 2 | Emily | Rose | 32 | 3 | | 3 | Ben | Harper | 38 | 1 | | 4 | Samanta | Jones | 35 | 2 | +----+-----------+--------+-----+-------------+
正如上面的注释和答案中所指出的,如果您可以重新构造表,那么您绝对应该—正如其他人所提到的,最好将表重新构造为具有额外的列,这样您的查询将更加简单和高效。但是,如果您陷入了一个无法解决的境地,并且您只有少量的数据,因此这一问题的低效性不会引起太大的关注,那么您可以使用一个联合来将几个简单的查询粘合在一起:

Select position.id, firstname, lastname, 'cook' AS position
FROM position LEFT JOIN people ON position.cook = people.id

UNION

Select position.id, firstname, lastname, 'teacher' AS position
FROM position LEFT JOIN people ON position.teacher = people.id

UNION
...

同样,这不是一种有效的方法-如果可以的话,应该重新构造数据。但是,如果出于任何原因,您不能这样做,那么这将使您以一组行的形式返回所需的数据,从而返回您所需的数据。

正如上面的注释和答案中所述,如果您可以重新构造表,您绝对应该—正如其他人所提到的,最好重新构造表以获得额外的列,这样,您的查询将更简单、更高效。但是,如果您陷入了一个无法解决的境地,并且您只有少量的数据,因此这一问题的低效性不会引起太大的关注,那么您可以使用一个联合来将几个简单的查询粘合在一起:

Select position.id, firstname, lastname, 'cook' AS position
FROM position LEFT JOIN people ON position.cook = people.id

UNION

Select position.id, firstname, lastname, 'teacher' AS position
FROM position LEFT JOIN people ON position.teacher = people.id

UNION
...

同样,这不是一种有效的方法-如果可以的话,应该重新构造数据。但是,如果出于任何原因,您不能这样做,那么这将使您以一组行的形式返回所需的数据,从而返回所需的数据。

更改表结构如何:1-将位置表更改为id,位置名称2-向人员表位置id添加额外列。。那么你有更简单的问题,可能是个主意@Jarla这是唯一的想法。@草莓rahul_m给出了第二个想法。哎呀,这是一个糟糕的想法。更改表结构如何:1-将位置表更改为id,位置名称2-向人员表位置_id添加额外的列。。那么你有更简单的问题,可能是个主意@“贾拉,这是唯一的主意。”草莓拉胡尔·m说了第二个主意。哎呀,这是个糟糕的主意。