2010-01-03 4 views
1

J'ai une requête MySQL qui sélectionne le contenu créé par les amis de l'utilisateur actuel et liste ce contenu dans l'ordre chronologique inverse. Comment puis-je "développer" cette requête de façon à ce qu'elle liste les commentaires en plus des n? Uds?Expansion de la requête mySQL pour inclure plus de contenu

est ici la structure de la table de commentaire:

  • cid (commentaire ID)
  • uid (ID de l'utilisateur qui a posté un commentaire)
  • horodatage (utilise même date UNIX Format comme le « noeud créé » colonne de la table de nœud au-dessus)

donc maintenant la requête saisit tous les « nœuds » écrits par des gens qui sont copains avec le utilisateur actuel. Je veux aussi saisir tous les commentaires écrits par des personnes qui sont des copains avec l'utilisateur actuel. Ensuite, je veux lister ces nœuds et commentaires dans l'ordre DESC en fonction de la date à laquelle ils ont été créés.

Il semble que j'ai besoin d'ajouter plus de choses à mon instruction select, mais je ne sais pas quoi.

+0

Vous ne sélectionnez que deux colonnes (node.nid, node.created). Ai-je raison de vouloir augmenter cette sélection à trois colonnes: (node_id, comment_id, created) où pour chaque ligne, un seul de (node_id, comment_id) est défini? Qu'en est-il des autres données associées au noeud et au commentaire, telles que le corps du texte? Tu ne devrais pas aller chercher ça aussi? Ou allez-vous chercher cela dans une requête séparée? –

+0

Nous pouvons aller chercher ça aussi. J'essayais juste de garder ma question simple. Je me suis dit que si je pouvais obtenir seulement une liste d'identifiants de noeuds et de commentaires dans l'ordre chrono inverse, alors je peux trouver comment les transformer en histoires complètes et en commentaires. Je ne voulais pas demander quelque chose d'aussi délicat que personne ne le réponde. – bflora2

+0

@bflora: Je suis content d'entendre ça. Je craignais que vous alliez seulement retourner tous les identifiants, puis obtenir le reste des données en faisant une boucle et en faisant de nouvelles requêtes. Garder la question simple est une bonne chose, mais je suis toujours curieux d'en savoir un peu plus sur le contexte derrière la question pour m'assurer qu'il n'y a pas une façon plus facile de résoudre le problème, et c'est pourquoi j'ai demandé. –

Répondre

1

Vous pouvez utiliser une UNION ALL pour combiner les résultats des deux requêtes:

SELECT nodeid, commentid, created FROM (
    SELECT node.nid AS nodeid, NULL as commentid, node.created AS created 
    FROM node node 
    LEFT JOIN user_relationships user_relationships ON node.uid = user_relationships.requestee_id 
    LEFT JOIN users users_user_relationships ON user_relationships.requestee_id = users_user_relationships.uid 
    WHERE (node.status <> 0) AND (node.type in ('drigg', 'blog_post')) AND (user_relationships.requester_id = 1) 
    UNION ALL 
    SELECT NULL as nodeid, comment.cid AS commentid, comment.timestamp AS created 
    FROM node node 
    LEFT JOIN user_relationships user_relationships ON node.uid = user_relationships.requestee_id 
    LEFT JOIN users users_user_relationships ON user_relationships.requestee_id = users_user_relationships.uid 
    WHERE (node.status <> 0) AND (node.type in ('drigg', 'blog_post')) AND (user_relationships.requester_id = 1) 
) 
ORDER BY created DESC 
1

Donc maintenant la requête saisit tous les « nœuds » écrits par des gens qui sont copains avec l'utilisateur en cours. Je veux aussi saisir tous les commentaires écrits par des personnes qui sont des copains avec l'utilisateur actuel. Ensuite, je veux lister ces nœuds et commentaires dans l'ordre DESC en fonction de la date à laquelle ils ont été créés.

Utilisation:

SELECT n.nid, 
      COALESCE(c.timestamp, n.created) AS coalesced_timestamp, 
      c.comment 
    FROM NODE n 
LEFT JOIN USER_RELATIONSHIPS ur ON ur.requestee_id = n.uid 
LEFT JOIN USERS u ON u.uid = ur.requestee_id 
LEFT JOIN COMMENT c ON c.uid = u.uid 
        AND c.nid = n.nid 
    WHERE n.status <> 0 
     AND n.type in ('drigg', 'blog_post') 
     AND ur.requester_id = 1 
ORDER BY coalesced_timestamp DESC 

C'est based on the ERD listed here.

Cela n'a pas de sens d'avoir des alias de table identiques ou plus longs que le nom de la table elle-même.

+0

Bon point DESC avec les alias de table inutiles . Si je comprends votre requête, je pense que cela ne ferait que lister les commentaires que l'utilisateur a fait sur les nœuds qu'ils ont également créés. Peut-être que bflora veut aussi des commentaires faits par un utilisateur sur des noeuds qu'ils n'ont pas créés? Je ne sais pas drupal, donc je ne sais pas si c'est même possible. –

+0

Mark est correct. Je veux "découpler" les commentaires des nœuds de cette requête. Je veux une liste des derniers commentaires et nœuds créés par les copains de l'utilisateur actuel. De cette façon, l'utilisateur peut voir ce que ses amis ont posté et commenté et peuvent trouver de nouvelles choses. Après avoir parcouru le module Vues de Drupal, il semble qu'il ne soit pas capable de renvoyer une liste de commentaires et de nœuds dans la même requête, ce qui génère une requête personnalisée. Drupal est génial pour vous permettre de lister les nœuds. Je souhaite que je puisse inclure des commentaires, supprimés de leur contexte, dans la même requête. – bflora2

+0

Mise à jour sur la base des clarifications. –

Questions connexes