使用左连接复制记录


Duplicating records Using LEFT JOIN

在下面我有两个表。在第一个表中,我有一个模型列表。在第二张表上,我为一些模型添加了键。例如,我为Id模型添加了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>
结果

model

100
      123
      125
100
      123
      125
101
100
105
      125
107
      127
如您所见,编号为100的模型是重复的,因为它有两个键。我尝试使用SELECT DISTINCTGROUP BY,但没有得到正确的结果。 正确的结果应该是

model

100
      123
      125
101
100
105
      125
107
      127

我只是好奇。这是你的表在提琴我做的结果: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没有重复。(不是如果你使用"m.id = mk.model_id"在你的SQL)。所以这几乎就是你想要的(只是格式需要调整)。

您可以遍历这些结果,并对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.*做select,而是使用你想要的字段。

像这样: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

using 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>";
}