выбрать из одной таблицы, считать из другой, где идентификатор связан - PullRequest
18 голосов
/ 12 мая 2011

вот мой код:

$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

heres мой 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   
}

?>

Ответы [ 2 ]

36 голосов
/ 12 мая 2011

Попробуйте изменить лайки ...

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

... для ...

(select count(*) from bookings where b.id_customer = c.id)
24 голосов
/ 12 мая 2011

Ваш запрос неправильно использует COUNT, который был покрыт @ Will A's answer .

Я также хотел бы предложить, возможно, лучшую конструкцию альтернативы, которая, я думаю, отражает ту же логику:

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, имеет более одного значения на группу, вы не можете контролировать , какое значение будет фактически возвращено при извлечении этого столбца без агрегирования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...