web-dev-qa-db-ja.com

1つのテーブルから選択し、IDがリンクされている別のテーブルからカウントする

私のコードはここにあります:

$sql = mysql_query("select c.name, c.address, c.postcode, c.dob, c.mobile, c.email, 
                    count(select * from bookings where b.id_customer = c.id) as purchased, count(select * from bookings where b.the_date > $now) as remaining, 
                    from customers as c, bookings as b 
                    where b.id_customer = c.id
                    order by c.name asc");

あなたは私がやろうとしていることを見ることができますが、このクエリを正しく書く方法がわかりません。

ここで私が得るエラー:

警告:mysql_fetch_assoc():指定された引数は有効なMySQL結果リソースではありません

ここに私のmysql_fetch_assoc:

<?php

while ($row = mysql_fetch_assoc($sql))
{
    ?>

    <tr>
    <td><?php echo $row['name']; ?></td>
    <td><?php echo $row['mobile']; ?></td>
    <td><?php echo $row['email']; ?></td>
    <td><?php echo $row['purchased']; ?></td>
    <td><?php echo $row['remaining']; ?></td>
    </tr>

    <?php   
}

?>
18
scarhand

のようなものを変更してみてください...

count(select * from bookings where b.id_customer = c.id)

...に...

(select count(*) from bookings where b.id_customer = c.id)
36
Will A

@ Will Aの回答 でカバーされているCOUNTがクエリで誤って使用されています。

私はまた、同じロジックを反映していると私が思う、より良い構成の代替案を提案したいと思います。

SELECT
  c.name,
  c.address,
  c.postcode,
  c.dob,
  c.mobile,
  c.email,
  COUNT(*) AS purchased,
  COUNT(b.the_date > $now OR NULL) AS remaining
FROM customers AS c
  INNER JOIN bookings AS b ON b.id_customer = c.id
GROUP BY c.id
ORDER BY c.name ASC

注:通常、集計されていないすべてのSELECT式をGROUP BYに含めることが期待されます。ただし、MySQLは 短縮されたGROUP BYリスト をサポートしているため、プルするすべての非集約データを一意に識別するキー式を指定するだけで十分です。 機能を勝手に使用することは避けてください。 GROUP BYに含まれていない列にグループごとに複数の値がある場合、その列をプルしたときに実際に返される値を制御できません集約なし

24
Andriy M