2009-10-13 6 views
0

Eh bien pour une raison quelconque, MySQL ne supporte pas les sous-requêtes dans une vue. Je suis coincé en utilisant MySQL pour l'avenir prévisible et j'ai besoin d'écrire une vue pour agréger les données d'une table de style EAV dans un format plus lisible. La vue elle-même va servir de modèle pour une application basée sur Ruby on Rails (elle est en lecture seule, donc je suis en sécurité en utilisant une vue).Comment puis-je réécrire cette requête SQL complexe pour ne pas utiliser une sous-requête pour les vues MySQL?

Comment pourrais-je, si je le peux, réécrire cette bête pour en créer une vue? Je suppose que si je devais, je pourrais juste créer une série de mini-vues et ensuite une vue principale (une vue pour les gouverner tous, selon le cas) mais je me demande s'il y a une autre façon.

Voici le monstre; le grand nombre de jointures externes sont parce que tous les champs sont facultatifs, mais je dois afficher toutes les colonnes:

select ls.subscriberid as id, l.name as list_name, 
    ifnull(cfn.first_name, '') as first_name, 
    ifnull(cln.last_name, '') as last_name, 
    ifnull(ce.email_address, '') as email_address, 
    ifnull(cm.mobile_phone, '') as mobile_phone 
from (
    select ls.subscriberid, ifnull(s.data, '') as first_name 
    from subscribers_data s 
     right outer join list_subscribers ls on ls.subscriberid = s.subscriberid 
    where s.fieldid = 2 /* First Name */ 
) cfn 
right outer join (
    select ls.subscriberid, ifnull(s.data, '') as last_name 
    from subscribers_data s 
     right outer join list_subscribers ls on ls.subscriberid = s.subscriberid 
    where s.fieldid = 3 /* Last Name */ 
) cln on cfn.subscriberid = cln.subscriberid 
right outer join (
    select ls.subscriberid, ls.emailaddress as email_address 
    from list_subscribers ls 
) ce on ce.subscriberid = cfn.subscriberid 
right outer join (
    select ls.subscriberid, ifnull(s.data, '') as mobile_phone 
    from subscribers_data s 
     right outer join list_subscribers ls on ls.subscriberid = s.subscriberid 
    where s.fieldid = 81 /* Mobile Phone */ 
) cm on cm.subscriberid = cfn.subscriberid 
right outer join list_subscribers ls on ls.subscriberid = cfn.subscriberid 
inner join lists l on ls.listid = l.listid 

Répondre

0

essayez celui-ci:

SELECT ls.subscriberid as id, l.name as list_name, 
     ifnull(group_concat(CASE WHEN s.fieldId = 2 
           THEN s.data 
           ELSE NULL 
          END), '') as first_name, 
     ifnull(group_concat(CASE WHEN s.fieldId = 3 
           THEN s.data 
           ELSE NULL 
          END), '') as last_name, 
     ifnull(ls.email_address, '') as email_address, 
     ifnull(group_concat(CASE WHEN s.fieldId = 81 
           THEN s.data 
           ELSE NULL 
          END), '') as mobile_phone 
    FROM list_subscribers ls 
INNER JOIN lists l on ls.listid = l.listid 
LEFT JOIN subscribers_data s on ls.subscriberid = s.subscriberid 
    GROUP BY ls.subscriberid, l.name, ls.email_address 
+0

Cela semble fonctionner. Merci beaucoup –

Questions connexes