PHP / MySQL: creo que necesito usar un JOIN aquí, pero no sé cómo

Esta es mi consulta:

SELECT messages.id AS m_id, messages.user_id AS m_uid, messages.project_id AS m_pid, messages.date_created AS m_dc, messages.type AS m_type, messages.file_url AS m_fu, messages.message_text AS m_text, messages.deleted AS m_del,
               projects.id AS p_id, projects.name AS p_name, projects.company_id AS p_cid,
               users.id AS u_id, users.name AS u_name
        FROM messages, projects, users
        HAVING `m_pid` = '$project_id' AND m_uid = u_id
        ORDER BY `m_dc` DESC

He estado usando HAVING en lugar de WHERE porque WHERE no parece funcionar con las palabras clave AS que estoy usando. El resultado es que mi consulta devuelve más resultados de los que necesito. Creo que se supone que debo usar JOINs aquí, pero realmente no puedo entenderlos. ¡Por favor ayuda!

:) Gracias

preguntado el 16 de mayo de 11 a las 18:05

puedes usar un WHERE cláusula para que coincida digamos messages.p_id=project.id ahí tienes un JOIN invisible. -

3 Respuestas

Es verdad, debe usar JOIN en lugar de la sintaxis FROM table1, table2.

Para responder a su problema de manera más directa: la cláusula WHERE opera en las columnas de las tablas; la cláusula HAVING opera en su conjunto de resultados (que incluye sus alias).

¿Cómo se relacionan sus tablas entre sí? Esa es la pregunta que debe responder primero: una vez que tenga esa respuesta, póngala prácticamente directamente en la cláusula ON de JOIN.

SELECT messages.id AS m_id, messages.user_id AS m_uid, messages.project_id AS m_pid, messages.date_created AS m_dc, messages.type AS m_type, messages.file_url AS m_fu, messages.message_text AS m_text, messages.deleted AS m_del, projects.id AS p_id, projects.name AS p_name, projects.company_id AS p_cid,
users.id AS u_id, users.name AS u_name
FROM messages
JOIN users ON messages.user_id = user.id
JOIN projects ON projects.user_id = user.id # this is just a guess
WHERE messages.id = $project_id
ORDER BY `m_dc` DESC

Para tener una mejor idea de cómo se relacionan las tablas JOIN, es posible que desee consultar este útil página que muestra JOINs como diagramas de Venn.

contestado el 16 de mayo de 11 a las 22:05

SELECT 
       messages.id AS m_id, messages.user_id AS m_uid, messages.project_id AS m_pid, 
       messages.date_created AS m_dc, messages.type AS m_type, messages.file_url AS m_fu, 
       messages.message_text AS m_text, messages.deleted AS m_del,
       projects.id AS p_id, projects.name AS p_name, projects.company_id AS p_cid,
       users.id AS u_id, users.name AS u_name
FROM 
  messages 
JOIN 
  users ON messages.user_id = users.id
JOIN 
  projects ON projects.id=messages.project_id
WHERE 
  `m_pid` = '$project_id'
ORDER BY 
  `m_dc` DESC

contestado el 16 de mayo de 11 a las 22:05

¿Prueba esto?

SELECT m.id AS m_id, 
    m.user_id AS m_uid, 
    m.project_id AS m_pid, 
    m.date_created AS m_dc, 
    m.type AS m_type, 
    m.file_url AS m_fu, 
    m.message_text AS m_text, 
    m.deleted AS m_del,               
    p.id AS p_id, 
    p.name AS p_name, 
    p.company_id AS p_cid,               
    u.id AS u_id, 
    u.name AS u_name
FROM messages as m
INNER JOIN projects as p on p.id = m.project_id
INNER JOIN users as u ON u.id = m.user_id              
WHERE m.project_id = '$project_id' 
ORDER BY ....

contestado el 16 de mayo de 11 a las 22:05

Ah, muchas gracias. Además de no entender la situación de JOIN, también me di cuenta después de leer tu publicación, que se supone que no debo poner marcas al revés alrededor de los nombres de los campos. Es por eso que, para empezar, recibía errores en mi cláusula WHERE. - Frank

@Frank, eso no es realmente cierto; debe usar comillas invertidas en los nombres de bases de datos, tablas y columnas (incluso alias). Lo más probable es que los errores que estaba viendo fueran el resultado de hacer referencia a nombres de alias, en lugar de nombres de columnas reales. - TehShrike

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.