PHP MYSQL SELECT和LEFT JOIN - 不返回所有结果

时间:2017-08-22 10:31:20

标签: php mysql

我有两张表customercustomer_transaction。两者都有共同的customer_id,但customer_transaction还有一个描述字段,我希望根据常见的 customer_id 返回结果。 结果正常,但省略了 customer_id 以及 customer_id customer_transaction 的所有记录的 customer_id 。根据图像描述。我确信我在这里错过了一些小事。

enter image description here

相关代码的一部分。我似乎认为问题出在SELECT语句中。

$sql = "SELECT * FROM customer LEFT OUTER JOIN customer_transaction ON customer. customer_id =customer_transaction. customer_id WHERE customer.customer_group_id = $input";

$sth = $pdo->prepare($sql);
$sth->bindParam(':start',$start,PDO::PARAM_INT);
$sth->bindParam(':length',$length,PDO::PARAM_INT);
$sth->bindParam(':query',$query,PDO::PARAM_STR);
$sth->execute();

foreach ($sth->fetchAll(PDO::FETCH_ASSOC) as $row) {
    $phpvar = "$row[description] "; //creat variable for descriptio so as to limit the length using substr
    echo '<tr>';
    echo '<td>'. $row['customer_id'] . '</td>';
    echo '<td>'. $row['company_name'] . '</td>';
    echo '<td>'. $row['firstname'] ." ". $row['lastname'] .'</td>';
    echo '<td>'. $row['email'] . '</td>';
    echo '<td>'. $row['telephone'] . '</td>';
    echo '<td>'. $row['customer_id'] . '</td>';
    echo '<td>'. $row['customer_group_id'] . '</td>';
    echo '<td>'. substr($phpvar,0) . '</td>'; //Limit the length of the transactions here
    echo '<td width=250>';

1 个答案:

答案 0 :(得分:1)

问题是你有两次customer_id。但是,该数组只能有一个名为customer_id的密钥。使用字段名称作为键,将值简单地按字段复制到数组字段。第二次出现的值,即customer_transaction表中的值,将覆盖customer表中的值,并且因为不是每个客户都有一个事务,所以你会在那里得到空字段。

最佳解决方案是在您需要的字段中更精确。无论如何,只有获取您需要的字段而不是使用*

,这是一种很好的做法

因此,您的查询可能如下所示。稍微冗长一点,但具有使用别名,计算值的灵活性,并且没有返回您不使用的字段的开销。

SELECT
    c.customer_id,
    c.company_name,
    c.firstname,
    c.email,
    c.telephone,

    /* You could provide the field with an alias */
    t.customer_id as transaction_customer_id,

    /* Or use its value to return a more sensible value */
    CASE WHEN t.customer_id IS NULL 
      THEN 'N' 
      ELSE 'Y' END AS has_transaction,
    t.customer_group_id
FROM customer 
LEFT OUTER JOIN customer_transaction ON customer. customer_id = customer_transaction.customer_id 
WHERE customer.customer_group_id = $input