2011-05-11 15 views
12

aquí está mi código:seleccionar de una tabla, contar de otra donde identificadores vinculados

$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"); 

se puede ver lo que estoy tratando de hacer, pero no estoy seguro cómo escribir esta consulta correctamente.

aquí está el error que consigo:

Advertencia: mysql_fetch_assoc(): suministrado argumento no es el resultado de MySQL válida recursos

heres mi 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 
} 

?> 
+0

¿Esto funciona cuando se ejecuta desde phpmyadmin o la interfaz CLI? –

+0

Muestra cómo hiciste tu consulta 'mysql_fetch_assoc()'. – stealthyninja

+1

lo agregué a la publicación original ... – scarhand

Respuesta

28

Intente cambiar los gustos de ...

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

... a ...

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

Su consulta utiliza incorrectamente COUNT, que ha sido cubierto por @Will A's answer.

También me gustaría sugerir una alternativa posiblemente mejor construida, que, creo, refleja la misma lógica:

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 

Nota: Normalmente se espera que incluir todas las expresiones no agregadas SELECT en el grupo POR. Sin embargo, MySQL admite shortened GROUP BY lists, por lo que es suficiente para especificar las expresiones clave que identifican de manera única todos los datos no agregados que está extrayendo. Por favor, evite el uso arbitrario de la función. Si una columna no se incluye en el grupo A tiene más de un valor por grupo, no tiene ningún control sobre que efectivamente se devuelve el valor al tirar de esa columna sin agregación.

+0

Se supone que esta es la respuesta correcta. – jaypabs

Cuestiones relacionadas