2013-05-24 5 views
0

J'essaye d'afficher des données de deux tables différentes commandées par l'heure où les données ont été créées.Dois-je utiliser JOIN ou UNION pour cette requête MYSQL?

Voici les 2 tables je tire des données à partir de:

active_projects

+------------+------------+---------+-------+-------------+ 
| project_id | ts_created | user_id | title | description | 
+------------+------------+---------+-------+-------------+ 

aime

+---------+------------+------------+ 
| user_id | project_id | ts_created | 
+---------+------------+------------+ 

Le résultat souhaité est l'ensemble des données extraites de ces colonnes affichées correctement, commandé par cette colonne:

+------------+ 
| ts_created | 
+------------+ 

C'est la requête que je suis actuellement en utilisant:

$sql = "SELECT * 
     FROM (SELECT project_id AS ppid, 
        ts_created AS pts, 
        user_id AS puid, 
        title AS ptitle, 
        description AS pdesc 
       FROM active_projects 
       WHERE user_id = 12) 
     UNION 
      (SELECT id AS lid, 
        user_id AS luid, 
        project_id AS lpid, 
        ts_created AS lts 
       FROM likes 
       WHERE user_id = 12)"; 

Mais, cela ne fonctionne pas comme je veux. J'ai essayé de déboguer ce qui se passe mais maintenant je dis simplement que ce n'est pas en train de récupérer les données.

J'ai fait des recherches sur JOIN et UNION mais je ne suis pas sûr de savoir lequel je devrais utiliser pour cette requête. Toute aide est grandement appréciée.

EDIT: La requête s'affiche désormais correctement à l'aide de la réponse de @ Samuel. Mais, maintenant les résultats sont affichés 3 fois par ligne. Je fais cela à la fin de la requête:

$act = mysql_query($sql); 

Puis, quand je fais écho les résultats que je suis en utilisant une boucle while aime ceci:

while ($t = mysql_fetch_row($act)) { 
    echo $t[1]; 
} 

Toutes les idées pour lesquelles chaque rangée est affiché 3 fois?

+0

Pouvez-vous nous indiquer votre résultat souhaité? Comment nous connaîtrons la raison de votre insatisfaction? – Yogus

+1

Si vous voulez obtenir des mentions «J'aime» pour des projets actifs, utilisez JOIN. Si vous voulez obtenir des goûts ET des projets actifs, alors vous avez besoin d'UNION. Qu'est-ce que tu veux? – kuncajs

+0

UNION: Les colonnes sélectionnées dans les positions correspondantes de chaque instruction SELECT doivent avoir le même type de données. – bitWorking

Répondre

2

Votre requête est assez terrible en termes de performances d'exécution et ne produit pas le résultat que vous souhaitez. Probablement plus utile:

$sql = " 
    SELECT * FROM active_projects 
    LEFT JOIN likes ON (active_projects.user_id = likes.user_id) 
    WHERE user_id = 12"; 

Untested, mais quelque chose comme ça est ce que vous avez besoin. Ceci devrait créer un résultat de toutes les entrées de active_project pour l'user_id 12 left joint avec les likes de la table.

+0

Cela fonctionne plutôt bien. J'ai dû ajuster quelques choses mais j'ai le résultat souhaité maintenant. Sauf pour le fait que tout est affiché 3 fois. Je cours la requête à travers une boucle while. Des pensées? – dalton

+0

Les ensembles triples sont-ils affichés par requête ou pourquoi le faites-vous en boucle? – Samuel

+0

Oui, les triplets sont affichés par requête. – dalton

0

D'abord, votre requête a un problème. Vous ne pouvez pas faire select * from (select ...). il devrait y avoir une clause 'where' avant d'appeler une autre sous-requête. Vous devez utiliser join au lieu de union car union est utilisée pour afficher les résultats des tables avec les mêmes noms/types de colonne (alias) tandis que join utilise une clé étrangère de l'autre table pour afficher une sortie 'jointe'.

Effectuez les opérations suivantes:

SELECT A.project_id AS ppid, 
     A.ts_created AS pts, 
     A.user_id AS puid, 
     A.title AS ptitle, 
     A.description AS pdesc, 
     B.id AS lid, 
     B.user_id AS luid, 
     B.project_id AS lpid, 
     B.ts_created AS lts 
FROM active_projects A 
LEFT JOIN likes B ON 
     A.user_id = B.user_id 
WHERE A.user_id = 12 ORDER BY B.ts_created; 

En fait, vous pouvez choisir entre, RIGHT JOIN et LEFT JOIN.

+0

Cela n'a pas fonctionné pour moi. Pour une raison quelconque, il n'aimait pas les alias ajoutés aux noms des tables. – dalton