IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête d'addition de deux requêtes différentes : est-ce possible ?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Requête d'addition de deux requêtes différentes : est-ce possible ?
    Bonjour à tous,

    Je vous remercie par avance pour le temps que m'accorderez.
    Voila j'ai une demande un peu particulière, j'ai actuellement un forum PHPbb ainsi qu'un site web monté de tout pièce, j'aimerais, sur un même onglet, afficher les messages non lues sur le forum ainsi que les news non lues sur le site.
    J'ai actuellement deux requête, la première récupère les messages non lues du forum, et la deuxième les news non lues du site.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    $req_forum ='SELECT t.forum_id,
    			t.topic_title,
    			t.topic_id,
    			t.topic_last_post_id, 
    			t.topic_last_post_time, 
    			tt.mark_time as topic_mark_time, 
    			ft.mark_time as forum_mark_time 
    		FROM (phpbb_topics t) 
    		LEFT JOIN phpbb_topics_track tt 
    		ON (tt.user_id = '.$user_id.' AND t.topic_id = tt.topic_id) 
    		LEFT JOIN phpbb_forums_track ft ON (ft.user_id = '.$user_id.' AND t.forum_id = ft.forum_id) 
    		WHERE ( (tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) 
    		OR (tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) 
    		OR (tt.mark_time IS NULL AND ft.mark_time IS NULL AND t.topic_last_post_time > '.$last_mark.') ) 
    		AND t.topic_moved_id = 0 AND t.topic_approved = 1 
    		AND t.forum_id in (2,3,4,6,7,8,9,11,12,14,17,37,39,40,56,57,58,59,61,62,63)
    		ORDER BY t.topic_last_post_time DESC 
    		LIMIT 0 , 5 ';
    $res_req_forum = $db->sql_query($req_forum);
     
    	$req_news = 'SELECT id_news,titre 
    			FROM news_wow
    			WHERE  id_news NOT IN
    			(SELECT id_news FROM suivi_news WHERE user_id = '.$user_id.')
    			ORDER BY date DESC LIMIT 0,8';
    	$res_req_news = $db->sql_query($req_news);
    J'aimerais pouvoir afficher les deux éléments mélanger et trier en fonction de la date, dans un premier temps je penses qu'il faudrait que les requête ai la même base temps, ce qui n'est pas le cas actuellement, j'ai fait pas mal d'essai avec UNION, mais rien de concluant.
    J'aimerais donc avoir votre avis sur la faisabilité de la chose !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    oui en réalisant une requête UNION
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT t.forum_id,
    			t.topic_title,
    			t.topic_id,
    			t.topic_last_post_id, 
    			t.topic_last_post_time, 
    			tt.mark_time as topic_mark_time, 
    			ft.mark_time as forum_mark_time 
    		FROM (phpbb_topics t) 
    		LEFT JOIN phpbb_topics_track tt  .....
     
    ....
    UNION
    SELECT id_news,titre,
    NULL, NULL, NULL, NULL, NULL -- le nombre de colonne retournée doit être égale 
    			FROM news_wow
    			WHERE  id_news NOT IN
    			(SELECT id_news FRO......

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Et tout d'abord merci pour ta réponse rapide !
    donc j'ai bien pris en compte ta remarque, néanmoins j'ai un petit problème,
    la requête concernant le forum est triée avec "topic_last_post_time"
    et celle concernant les news triée avec "date" du coup je ne sais comment triée la requête complète, si vous avez une idée, ci-dessous le code complet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    	$test_test ='SELECT 	t.forum_id,
    					t.topic_title,
    					t.topic_id,
    					t.topic_last_post_id, 
    					t.topic_last_post_time, 
    					tt.mark_time as topic_mark_time, 
    					ft.mark_time as forum_mark_time 
    			FROM (phpbb_topics t) 
    			LEFT JOIN phpbb_topics_track tt 
    			ON (tt.user_id = '.$user_id.' AND t.topic_id = tt.topic_id) 
    			LEFT JOIN phpbb_forums_track ft ON (ft.user_id = '.$user_id.' AND t.forum_id = ft.forum_id) 
    			WHERE ( (tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) 
    			OR (tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) 
    			OR (tt.mark_time IS NULL AND ft.mark_time IS NULL AND t.topic_last_post_time > '.$last_mark.') ) 
    			AND t.topic_moved_id = 0 AND t.topic_approved = 1 
    			AND t.forum_id in (2,3,4,6,7,8,9,11,12,14,17,37,39,40,56,57,58,59,61,62,63)
    			UNION
    			(SELECT id_news,titre,
    			NULL, NULL, NULL, NULL, NULL
    				FROM news_wow
    				WHERE  id_news NOT IN
    				(SELECT id_news FROM suivi_news WHERE user_id = '.$user_id.'))
    				ORDER BY "     " DESC
    				LIMIT 0,8';
    	$req_test_test = $db->sql_query($test_test);
     
    /*AFFICHAGE DES NEWS*/
    while(($data2 = $db->sql_fetchrow($req_test_test)))
    {
    if(!empty($data2['titre']))
    { echo $data2['titre'].'<br>';}  
    else echo $data2['topic_title'].'<br>';
    }
    Merci par avance =)

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    Ravi de donner un coup de main

    le tri ne peut se faire que sur le résultat de l'UNION

    Positionne la colonne qui va servir de référence de trie à la même position et allias là. Il suffit de demander le trie sur cet allias ou le numéro de la colonne (cela dépend des SGBD).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SELECT 	t.forum_id,
    					t.topic_title,
    					t.topic_id,
    					t.topic_last_post_id, 
    					t.topic_last_post_time AS Date_Trie, 
    					tt.mark_time as topic_mark_time, 
    					ft.mark_time as forum_mark_time 
    			FROM (phpbb_topics t) 
    			LEFT JOIN phpbb_topics_track tt 
    			ON (tt.user_id = '.$user_id.' AND t.topic_id = tt.topic_id) 
    			LEFT JOIN phpbb_forums_track ft ON (ft.user_id = '.$user_id.' AND t.forum_id = ft.forum_id) 
    			WHERE ( (tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) 
    			OR (tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) 
    			OR (tt.mark_time IS NULL AND ft.mark_time IS NULL AND t.topic_last_post_time > '.$last_mark.') ) 
    			AND t.topic_moved_id = 0 AND t.topic_approved = 1 
    			AND t.forum_id in (2,3,4,6,7,8,9,11,12,14,17,37,39,40,56,57,58,59,61,62,63)
    			UNION
    			SELECT id_news,titre,
    			NULL, NULL, 
                            Date as date_Trie
                          , NULL, NULL
    				FROM news_wow
    				WHERE  id_news NOT IN
    				(SELECT id_news FROM suivi_news WHERE user_id = '.$user_id.')
    				ORDER BY Date_Trie -- ou 5 DESC
    				LIMIT 0,8
    Attention : le mot "date" est un mot clé. aussi l'utiliser comme nom de colonne est plutôt une mauvaise idée

    Pour le LIMIT, je n'ai pas cette fonction. mais je pense que cela ne renverra ce que tu souhaites (LIMIT n'est pas dans mon SGBD).
    Dans firebird, je peux utiliser FIRST dans et pour la seconde requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	SELECT FIRST 8
                        id_news,titre,
    			NULL, NULL, 
                            Date as date_Trie
                          , NULL, NULL
    				FROM news_wow
    				WHERE  id_news NOT IN
    				(SELECT id_news FROM suivi_news WHERE user_id = '.$user_id.')
    				ORDER BY Date_Trie -- ou 5 DESC

  5. #5
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Il faut que tu places à la même position les deux dates à prendre en compte, et que tu fasses ORDER BY + Limit à un niveau supérieur.

    Dans le principe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT *
    FROM (
    SELECT col1, col2, datepost as date_tri
    FROM T1
    UNION SELECT col1, null, datenews as date_tri
    )
    ORDER BY date_tri DESC
    LIMIT 0,8

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci à vous pour vos réponses, le tout marche très bien !
    Maintenant une autre problématique à laquelle je n'avais pas pensé.
    Comment identifier si une variable est une news ou un message du forum,
    en effet je souhaiterais changer la couleur du texte en fonction de la provenance du message, je ne vais me pencher dessus, si vous avez une idée, je regarde cela de mon coté !

    A bientôt et merci encore =)

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Il suffit de les identifier dans la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT *
    FROM (
    SELECT col1, col2, datepost AS date_tri, 'post' AS source
    FROM T1
    UNION ALL
     SELECT col1, NULL, datenews AS date_tri, 'news' AS source
    FROM T2
    )
    ORDER BY date_tri DESC
    LIMIT 0,8

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci pour tout, tout marche parfaitement !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Addition de deux requêtes ?
    Par bond70 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/07/2010, 13h25
  2. Réponses: 1
    Dernier message: 01/06/2009, 17h17
  3. Réponses: 18
    Dernier message: 28/04/2008, 17h57
  4. Soustraction ou addition de deux requêtes
    Par gvdmoort dans le forum Requêtes
    Réponses: 7
    Dernier message: 07/01/2008, 21h09
  5. Addition entre deux requêtes
    Par tazmania dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/10/2006, 17h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo