2013-08-13 3 views
0
tableone: id | userid | date | photo | caption | visible 
tabletwo: id | userid | date | text | gender | notes 

J'ai deux tables avec des colonnes différentes. Je veux sélectionner les lignes des deux en utilisant une seule requête, je ferais le faire en utilisant la date (horodatage) et l'ID utilisateur. Est-il possible de les rejoindre ensemble?Sélectionnez une requête pour joindre deux tables?

SELECT id, photo, caption, visible 
FROM `tableone` 
WHERE `userid` = $user->id AND `date` = '$d' 
ORDER BY date desc 

SELECT id, text, gender, notes 
FROM `tabletwo` 
WHERE `userid` = $user->id AND `date` = '$d' 
ORDER BY date desc 
LIMIT 1 

EDIT: sortie souhaitée:

(
    [id] => 3 
    [photo] => 1 
    [caption] => Sample text 
    [visible] => 1 
    [text] => 
    [gender] => 
    [notes] => 
) 
(
    [id] => 23 
    [photo] => 1 
    [caption] => More sample text 
    [visible] => 
    [text] => 
    [gender] => 
    [notes] => 
) 
(
    [id] => 1 
    [photo] => 
    [caption] => 
    [visible] => 
    [text] => Blah jaspidj 
    [gender] => 2 
    [notes] => Sample Text 
) 
+2

cette question semble être posée presque tous les jours. –

+2

Regardez dans le mot-clé SQL JOIN. –

+0

Je ne veux pas rejoindre les colonnes ensemble. Je veux fusionner les deux tables, mais garder les lignes séparées. – ditto

Répondre

2

Le concept que vous recherchez est UNION (voir MySql UNION reference), qui combine les résultats de deux requêtes ensemble. En règle générale, seuls les résultats d'union contenant les mêmes colonnes s'affichent, mais vous demandez que deux types de requêtes différents soient associés. Si tout ce que vous aimez est de voir tous les résultats ensemble et vous ne se soucient pas d'avoir des cellules vides, alors cela devrait fonctionner pour vous:

(SELECT id, photo, caption, visible, null AS text, null AS gender, null AS notes 
FROM `tableone` 
WHERE `userid` = $user->id AND `date` = '$d' 
ORDER BY date desc) 
UNION ALL 
(SELECT id, null AS photo, null AS caption, null AS visible, text, gender, notes 
FROM `tabletwo` 
WHERE `userid` = $user->id AND `date` = '$d' 
ORDER BY date desc 
LIMIT 1) 

(Notez que je UNION ALL au lieu de UNION, ce qui signifie essentiellement " donnez-moi tous les résultats, y compris les doublons ». comme il ne pouvait pas être double dans cet ensemble, il est sûr d'utiliser UNION ALL pour obtenir un gain de performances)

La sortie de cela ne fait pas logiquement sens, mais il faut vous donner l'exemple de sortie que vous avez montré ci-dessus.

+0

Dans ce cas, vous voudrez utiliser UNION ALL qui est plus rapide car les deux instructions s'excluent mutuellement. – HLGEM

+0

@HLGEM Oui, merci. – ean5533

+0

Merci, cela a fonctionné. Y at-il de toute façon que la LIMITE 1 s'applique uniquement au tabletwo? J'ai dû le supprimer car il limitait l'ensemble de la requête à 1. – ditto

2

Vous pouvez obtenir les deux lignes de la table des données ayant userid et la date comme param? Ok devront donc utiliser un JOIN pour les obtenir en une seule rangée

SELECT t1.id, t1.userid, t1.date, t1.photo, t1.caption, t1.visible, t2.text, t2.gender, t2.notes 
FROM tableone t1 JOIN tableone t2 ON t1.ID = t2.ID 
WHERE t1.userid = "yourwantedid" AND t1.date = "yourwanteddate" 

Vous pouvez utiliser tout le tableau 1 dans la clause WHERE parce que vous intégrerez les deux tables en un.

Désolé pour mon mauvais anglais. Espérons que cela aide

Je vois récemment votre commentaire, peut-être que vous voulez utiliser l'clause UNION ALL

SELECT t1.id, t1.userid, t1.date, t1.photo, t1.caption, t1.visible 
FROM tableone t1 
WHERE userid = "yourwantedid" AND date = "yourwanteddate" 
UNION ALL 
SELECT t2.id, t2.userid, t2.date, t2.text as photo, t2.gender as caption, t2.notes as visible 
FROM tabletwo t2 
WHERE userid = "yourwantedid" AND date = "yourwanteddate" 

vous devez mettre un alias sur les colonnes à utiliser l'clause UNION ALL, qui correspondent aux colonnes noms des deux sélects.

Désolé pour mon mauvais anglais. Espérons que cela aide

+0

Vous avez une poignée d'erreurs dans votre exemple 'UNION ALL'. Vous utilisez l'alias 't1' s'il n'a pas été défini, vous faites référence à des colonnes qui n'existent pas dans' tableone', et vous sélectionnez deux fois 'tableone'. – ean5533

+0

Vous aviez raison, j'édite ma résolution à cause de son récent commentaire, et je l'ai fait usé. Je l'édite maintenant. Merci!! – GianlucaBobbio