使用LEFT JOIN复制记录

时间:2014-07-24 08:05:01

标签: php sql join pdo left-join

在下面我有2张桌子。在第一个表格中我有一个模型列表。在第二个表上我添加了一些模型的键。例如,我为Id 1

的模型添加了2个键(123和125)

模型

id(AI)     model
1          100
2          101
3          100
4          105
5          107

modelKeys

keyid(AI)    model_id     key
   1           1          123
   2           1          125
   3           4          125
   4           5          127

现在,使用PHP PDO我想列出所有模型和模型的密钥。

<?php

$query = 
"
SELECT
  m.*,
  mk.*
FROM
  models as m
LEFT JOIN modelKeys as mk
 ON m.id = mk.model_id
ORDER BY
 m.id
";

$sql = $db -> query($query);
$sql -> execute();

$fetch = $sql -> fetchAll(PDO::FETCH_ASSOC);

?>
<ol>

<?php

foreach($fetch as $models)
{
  echo "
   <li>
    $models[model]";

  foreach($fetch as $keys)
  {
    echo "<ul>";

    if($models['id'] == $keys['keyid'])
    {
      echo "<li>$keys[key]</li>";
    }

    echo "</ul>";
  }
  </li>";
}

?>

</ol>

RESULT

model

100
      123
      125
100
      123
      125
101
100
105
      125
107
      127

如您所见,编号为100的模型是重复的,因为它有2个键。我尝试使用SELECT DISTINCTGROUP BY,但没有得到正确的结果。

正确的结果应该是

model

100
      123
      125
101
100
105
      125
107
      127

2 个答案:

答案 0 :(得分:1)

使用PHP:

    $PassedKeys="";
    foreach($fetch as $models)
{
    //this should work
    if(strpos($PassedKeys,';'.$models['id'].';')===false){
    $PassedKeys.=";".$models['id'].";";
    }
    else{
        continue;
    }
  echo "
   <li>
    $models[model]";
  foreach($fetch as $keys)
  {
    echo "<ul>";

    if($models['id'] == $keys['keyid'])
    {
      echo "<li>$keys[key]</li>";
    }

    echo "</ul>";
  }
  </li>";
}

答案 1 :(得分:1)

我只是好奇。这是你在小提琴中的表格的结果:http://sqlfiddle.com/#!2/cae823/3

结果是

ID  MODEL   KEYID   MODEL_ID    KEYNR
1   100     1       1           123
1   100     2       1           125
2   101     (null)  (null)      (null)
3   100     (null)  (null)      (null)
4   105     3       4           125
5   107     4       5           127

据我所知,您的SQL没有重复项。 (如果你在SQL中使用了“m.id = mk.model_id”)。所以这几乎就是你想要的(只需要调整格式)。

你可以遍历这些结果,并且对于MODEL中的每个更改,都会为MODEL执行<li>。然后只需打印所有KEYNR。

所以在PHP这样的事情:(我没有测试这段代码的错误):

<?php

$query = 
"
SELECT
  m.*,
  mk.*
FROM
  models as m
LEFT JOIN modelKeys as mk
 ON m.id = mk.model_id
ORDER BY
 m.id
";

$sql = $db -> query($query);
$sql -> execute();

$fetch = $sql -> fetchAll(PDO::FETCH_ASSOC);

echo "<ol>";

$lastmodelid = 0;
foreach($fetch as $row) {

  if ($row['id'] != $lastmodelid) {
    if ($lastmodelid!=0) { echo "</li>"; }
    echo "<li>$row['model']";
  }
  $lastmodelid = $row['id'];

  echo "<ul>";
  echo "<li>$row['keynr']</li>";
  echo "</ul>";

}
if ($lastmodelid!=0) { echo "</li>"; }
echo "<ol>";

?>

我假设您不使用MODEL_ID / KEYNR自己创建重复项。如果你那么你确实需要使用一些DISTINCT,但在这种情况下,我建议不要在m。*和mk。*上做一个选择,但只需使用你想要的字段。

像这样:http://sqlfiddle.com/#!2/cae823/6

SELECT
  DISTINCT
  m.MODEL,
  mk.KEYNR
FROM
  models as m
LEFT JOIN modelKeys as mk
 ON m.id = mk.model_id
ORDER BY
 m.id

结果:

MODEL   KEYNR
100     123
100     125
101     (null)
100     (null)
105     125
107     127