繁体   English   中英

SQL JOIN 结果不断重复

[英]SQL JOIN result keeps repeating

在我的数据库中,我有 3 个表: userphonenumber 它们的结构相应地:

ID | name
---+------
 1 | Joe
 2 | Gin
 3 | Ash


ID |   Brand   | series
---+-----------+--------
 1 |  Samsung  | s7
 2 |  Iphone   | 6s
 3 |  Samsung  | s5


ID |  number   
---+----------
 1 |  77612  
 2 |  34014  
 3 |  98271

我想要做的是选择使用JOIN 这是我的尝试:

$query = "SELECT u.id, p.brand, n.number
          FROM `user` u 
          LEFT OUTER JOIN `phone` p
              ON u.id = p.id
          LEFT OUTER JOIN `number` n 
              ON p.id = n.id
          WHERE u.id = '$selected'";

$sql = mysql_query($query);

if ($sql === FALSE) { 
    die(mysql_error());
}

while ($result = mysql_fetch_row($sql)) {
    $final[] = $result;
    echo '<pre>';
    print_r($final);
    echo '</pre>';
}

其中$selected是来自表单输入的数组数组,它​​允许选择要显示的ID ,例如:

$selected = array(1, 3);

但结果是:

Array (
      [0] => Array (
          [0] => 1
          [1] => Samsung
          [2] => 77612
      )
    )
Array (
      [0] => Array (
          [0] => 1
          [1] => Samsung
          [2] => 77612
      )
      [1] => Array (
          [0] => 3
          [1] => Samsung
          [2] => 98271
      )
)

如果我们设置$selected = array(1, 2, 3) ,输出将与上图相同。 我怎么解决这个问题?

$selected =  array(array(1), array(2), array(3));

// make list of id from source array
$selected = call_user_func_array('array_merge', $selected);
$selected = implode(',', $selected); // 1,2,3  

并将 where 子句更改为

WHERE u.id in ($selected)

首先,您必须构建以逗号分隔的 ID。 为此,我使用在最简单的方法中找到的以下函数来 implode() 一个二维数组?

function implode_r($g, $p) {
    return is_array($p) ?
           implode($g, array_map(__FUNCTION__, array_fill(0, count($p), $g), $p)) : 
           $p;
}

然后您必须使用关键字IN稍微更改您的查询:

$ids=implode_r(",",$selected);

$query = "SELECT u.id, p.brand, n.number FROM `user` u 
LEFT OUTER JOIN `phone` p ON u.id = p.id LEFT OUTER JOIN `number` n 
ON p.id = n.id WHERE u.id in ($ids)";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM