2010-12-13 8 views
0

J'ai trois tables (s_place, s_place_bing, s_place_yahoo) qui ont le même schéma et contiennent des résultats similaires provenant de trois sources différentes. Ce que je voudrais, c'est une requête qui retourne tous les résultats des trois tables qui correspondent à un s_u_id donné, s_q_id et à la date.Aide requise pour une jointure de tables multiples ne renvoyant pas null/vide

+-----------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+-----------------+--------------+------+-----+---------+----------------+ 
| id    | int(10)  | NO | PRI | NULL | auto_increment | 
| s_u_id   | int(10)  | NO |  | NULL |    | 
| s_q_id   | int(10)  | NO |  | NULL |    | 
| place   | int(10)  | NO |  | NULL |    | 
| date   | int(10)  | YES |  | NULL |    | 
| fullurl   | varchar(255) | NO |  | NULL |    | 
| above_today  | varchar(255) | NO |  | NULL |    | 
| above_yesterday | varchar(255) | NO |  | NULL |    | 
| below_today  | varchar(255) | NO |  | NULL |    | 
| below_yesterday | varchar(255) | NO |  | NULL |    | 
| yesterday  | int(11)  | NO |  | NULL |    | 
+-----------------+--------------+------+-----+---------+----------------+ 

Il est tout à fait probable qu'il y aura plus de résultats dans une table que il y a dans un autre pour la même s_u_id, s_q_id et la date. Dans ce cas, il doit renvoyer des lignes nulles ou vides pour les tables qui n'ont pas de données.

Je l'ai obtenu jusqu'ici en utilisant la requête ci-dessous, mais il ne retourne pas de null/blancs.

SELECT s_place.s_u_id, s_place.s_q_id, `s_place`.place as place, `s_place`.fullurl as fullurl, `s_place`.date as date, s_place_bing.place as b_place,`s_place_bing`.fullurl as b_fullurl, s_place_bing.date as b_date, s_place_yahoo.place as y_place, `s_place_yahoo`.fullurl as y_fullurl, s_place_yahoo.date as y_date 
from s_place 
left join s_place_bing on s_place_bing.s_q_id = s_place.s_q_id and s_place_bing.date = s_place.date 
left join s_place_yahoo on s_place_yahoo.s_q_id = s_place.s_q_id and s_place_yahoo.date = s_place.date 
where s_place.s_u_id = 1 and s_place.s_q_id = 64 
order by s_place.date desc 

+--------+--------+-------+----------------------+------------+---------+--------------------------+------------+---------+-------------------+------------+ 
| s_u_id | s_q_id | place | fullurl    | date  | b_place | b_fullurl    | b_date  | y_place | y_fullurl   | y_date  | 
+--------+--------+-------+----------------------+------------+---------+--------------------------+------------+---------+-------------------+------------+ 
|  1 |  64 | 39 |  rrr.co.uk  | 1292112000 |  30 |  rrr.co.uk   | 1292112000 |  6 |  rrr.co.uk | 1292112000 | 
|  1 |  64 | 39 |  rrr.co.uk  | 1292112000 |  65 |  rrr.co.uk search/ | 1292112000 |  6 |  rrr.co.uk | 1292112000 | 
|  1 |  64 | 36 |  rrr.co.uk  | 1292025600 |  30 |  rrr.co.uk   | 1292025600 |  6 |  rrr.co.uk | 1292025600 | 
|  1 |  64 | 36 |  rrr.co.uk  | 1292025600 |  64 |  rrr.co.uk search/ | 1292025600 |  6 |  rrr.co.uk | 1292025600 | 
|  1 |  64 | 40 |  rrr.co.uk  | 1291939200 |  66 |  rrr.co.uk search/ | 1291939200 | 9999 |     | 1291939200 | 
|  1 |  64 | 40 |  rrr.co.uk  | 1291939200 |  29 |  rrr.co.uk   | 1291939200 | 9999 |     | 1291939200 | 
|  1 |  64 | 38 |  rrr.co.uk  | 1291852800 |  29 |  rrr.co.uk   | 1291852800 |  6 |  rrr.co.uk | 1291852800 | 
|  1 |  64 | 38 |  rrr.co.uk  | 1291852800 |  68 |  rrr.co.uk search/ | 1291852800 |  6 |  rrr.co.uk | 1291852800 | 

Voici comment cela devrait renvoyer les données.

+--------+--------+-------+----------------------+------------+---------+--------------------------+------------+---------+-------------------+------------+ 
| s_u_id | s_q_id | place | fullurl    | date  | b_place | b_fullurl    | b_date  | y_place | y_fullurl   | y_date  | 
+--------+--------+-------+----------------------+------------+---------+--------------------------+------------+---------+-------------------+------------+ 
|  1 |  4 | 39 |  rrr.co.uk  | 1292112000 |  30 |  rrr.co.uk   | 1292112000 |  6 |  rrr.co.uk | 1292112000 | 
|  1 |  64 |  |      |   |  65 |  rrr.co.uk search/ | 1292112000 |   |     |   | 
|  1 |  64 | 36 |  rrr.co.uk  | 1292025600 |  30 |  rrr.co.uk   | 1292025600 |  6 |  rrr.co.uk | 1292025600 | 
|  1 |  64 |  |      |   |  64 |  rrr.co.uk search/ | 1292025600 |   |     |   | 
|  1 |  64 | 40 |  rrr.co.uk  | 1291939200 |  66 |  rrr.co.uk search/ | 1291939200 | 9999 |     | 1291939200 | 
|  1 |  64 |  |      |   |  29 |  rrr.co.uk   | 1291939200 |   |     |   | 
|  1 |  64 | 38 |  rrr.co.uk  | 1291852800 |  29 |  rrr.co.uk   | 1291852800 |  6 |  rrr.co.uk | 1291852800 | 
|  1 |  64 |  |      |   |  68 |  rrr.co.uk search/ | 1291852800 |   |     |   | 

Espérons que quelqu'un puisse vous aider. Cheers, Matt

Répondre

0

Notez que dans votre désiré ensemble de résultats, les seules colonnes entièrement remplies sont celles de votre table s_place_bing. Ainsi, à partir du jeu de résultats que vous affichez, il semble que vous deviez indiquer vos tables s_place et s_place_yahoo à votre table s_place_bing. Cela dit, votre requête actuelle est triée sur s_place.date desc, mais votre jeu de résultats souhaité a des vides/des valeurs nulles dans ce champ.

Est-ce que cela vous donne le résultat que vous voulez?

SELECT 
    b.s_u_id, b.s_q_id, 
    p.place AS p_place, p.fullurl AS p_fullurl, p.date AS p_date, 
    b.place AS b_place, b.fullurl AS b_fullurl, b.date AS b_date, 
    y.place AS y_place, y.fullurl AS y_fullurl, y.date AS y_date 
FROM s_place_bing b 
LEFT JOIN s_place p ON b.s_q_id = p.s_q_id AND b.date = p.date 
LEFT JOIN s_place_yahoo y ON b.s_q_id = y.s_q_id AND b.date = y.date 
WHERE b.s_u_id = 1 and b.s_q_id = 64 
ORDER BY b.date DESC