0

次のような顧客とその電話番号を表示するネストされたリストがあります。

ジェイソン

555 111-1111
555 222-2222

クリステン

555 333-3333

ジョン

555 444-4444
555 555-5555
555 656-6666

ただし、メールを追加するのに問題があります。このコードは、各電話番号の下にメールを複製するだけですが、電話番号とメールを次のように顧客ごとにグループ化する必要があります。

ジェイソン

555 111-1111
555 222-2222
jason@jason.com
jason.alternative@jason.com 

クリステン

555 333-3333
kristen@kristen.com
kristen.alternative@kristen.com
kristen.personal@kristen.com

ジョン

555 444-4444
555 555-5555
555 656-6666
john@john.com

PHP コード:

<?php
$result = mysqli_query($dbc,"
SELECT 
fname, 
phone, 
email
FROM 
customer, 
phone, 
email, 
customer_phone, 
customer_email
WHERE
customer.id=customer_phone.customer_id
AND
phone.id=customer_phone.phone_id
AND
customer.id=customer_email.customer_id
AND
email.id=customer_email.email_id
order by fname
");

$oldname = null;
while($row = mysqli_fetch_array($result))
{
    if($oldname != $row['fname'])
    {
        echo "<h3>".$row['fname']."</h3>";
        $oldname = $row['fname'];
    }
    echo "<p>".$row['phone']."</p>";
    echo "<p>".$row['email']."</p>";
}
?>
4

1 に答える 1

1

このクエリは、最初に電話番号を取得し、2 番目にメールを取得することで、電話番号の後にメールを挿入します。「1-Phone」と「2-Email」の列は、メールが電話番号の後にソートされるようにします。

SELECT fname, '1-Phone' AS InfoType, phone AS TheInfo
  FROM Customer
  INNER JOIN phone ON phone.id=customer_phone.phone_id
  INNER JOIN customer_phone ON customer.id=customer_phone.customer_id
UNION SELECT fname, '2-Email', email
  FROM Customer
  INNER JOIN email ON email.id=customer_email.email_id
  INNER JOIN customer_email ON customer.id=customer_email.customer_id
ORDER BY fname, InfoType

ジョインを ANSI 構文に変更したのは、作業がしやすくなったからです。他に理由はありません。それがあなたの好みであれば、自由に結合条件を句に押し戻してWHEREください-私はそれについて強く感じません:)

レンダリング コードへの唯一の変更は、これを置き換えることです...

echo "<p>".$row['phone']."</p>";
echo "<p>".$row['email']."</p>";

... これとともに:

echo "<p>".$row['TheInfo']."</p>";
于 2013-03-22T03:42:01.483 に答える