【问题标题】:Duplicating records Using LEFT JOIN使用 LEFT JOIN 复制记录
【发布时间】:2014-07-24 08:05:01
【问题描述】:

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

模型

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

模型键

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 的模型是重复的,因为它有 2 个键。我尝试使用SELECT DISTINCTGROUP BY,但没有得到正确的结果。

正确的结果应该是

model

100
      123
      125
101
100
105
      125
107
      127

【问题讨论】:

    标签: php sql join pdo left-join


    【解决方案1】:

    我只是好奇。这是我在 Fiddle 中使用的表格的结果: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 执行 &lt;li&gt;。然后打印所有的 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
    

    【讨论】:

      【解决方案2】:

      使用 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>";
      }
      

      【讨论】:

      • 很抱歉,我的意思是不同的
      • SELECT distinct 不会给出任何结果。我正在寻找停止复制模型的方法。在我的 SQL 上,如果模型有超过 1 个键,那么模型编号将在结果列表中重复。使用 GROUP by 我们可以停止重复,但它也停止循环模型键。
      • 据我了解,您停止使用 PHP 技巧进行复制。不错的方法,我将继续寻找改变我的 SQL QUERY 的正确方法。想一想,可以通过 SQL 来修复它。
      • 如果按 m.id 分组对您不起作用,我认为除了创建函数或存储过程之外没有其他方法,因为这是一个左连接,它 WILL复制模型。祝你好运:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 2023-03-09
      相关资源
      最近更新 更多