Kan geen waarden opgeven met GROUP_CONCAT voor joins

Kan iemand me helpen?

Met deze vraag krijg ik de id's, maar het plaatst de scheidingstekens niet wanneer subscriber_data.fieldid null is. Bijvoorbeeld in plaats van 2, 12 komt het 2,12 als de waarde voor 4 null is ...

Ik denk dat het probleem zich op Deelnemen met subquery bevindt, maar ik kon het niet maken met twee link-joins in de hoofdquery ook ...

Dit is de vraag die ik gebruik:

SELECT 
    list_subscribers.emailaddress, 
    (SELECT 
         GROUP_CONCAT(IFNULL(customfields.fieldid,'') SEPARATOR '","') 
     FROM customfields 
     LEFT JOIN subscribers_data 
         ON subscribers_data.fieldid = customfields.fieldid 
     WHERE 
         customfields.fieldid IN (2,4,12,13,14,15,17,19,20,21,22,23,16,26,27) 
             AND 
         list_subscribers.subscriberid = subscribers_data.subscriberid
    ) AS data FROM list_subscribers

Bedankt iedereen.

0

1 antwoord

De linker join is nutteloos. Omdat u een voorwaarde hebt voor subscriber_data in de WHERE-component, retourneert die subquery niet die rijen waarvoor geen overeenkomende subscriber_data beschikbaar is, dus het werkt effectief alsof u INNER JOIN hebt gebruikt. U moet die voorwaarde toevoegen aan de voorwaarde voor koppeling aan de linkerkant, maar dit is onmogelijk in deze query-indeling. Waarden van de buitenste query zijn niet toegestaan ​​in join-voorwaarden in de innerlijke query.

Je zou het kunnen veranderen, maar blijkbaar moet je je aansluiten bij drie tabellen, waarbij de middelste tabel, subscriber_data, die ze allemaal aan elkaar koppelt, optioneel is. Dat klopt niet echt.

Of misschien zijn customfields de tabel die optioneel is, maar in dat geval zou je de tabel moeten hebben omgekeerd of een RECHTS JOIN moeten gebruiken.

Tot slot denk ik dat je dit wilde schrijven:

select
  s.emailaddress,
  GROUPCONCAT(IFNULL(f.fieldid, '') SEPARATOR '","')
from
  list_subscribers s
  inner join subscribers_data d on d.subscriberid = s.subscriberid
  left join customfields f on f.fieldid = d.fieldid
where
  d.fieldid in (2,4,12,13,14,15,17,19,20,21,22,23,16,26,27)
group by
  s.emailaddress

Of wilt u de ID's van de velden die voor de abonnee (s) zijn gevuld, vermelden? In dat geval zou het zijn:

select
  s.emailaddress,
  GROUPCONCAT(IFNULL(d.fieldid, '') SEPARATOR '","')
from
  list_subscribers s
  cross join customfields f
  left join subscribers_data d on 
    d.subscriberid = s.subscriberid and
    d.fieldid = f.fieldid
where
  f.fieldid in (2,4,12,13,14,15,17,19,20,21,22,23,16,26,27)
group by
  s.emailaddress
0
toegevoegd
In dat geval moet je teruggaan en proberen te beschrijven wat je wilt bereiken. Niet door een foutieve zoekopdracht te plaatsen, maar door echt Engels te gebruiken.
toegevoegd de auteur GolezTrol, de bron
Nog een keer gokken. Er is alleen zoveel dat je kunt doen met deze gegevens.
toegevoegd de auteur GolezTrol, de bron
Ik begrijp het, maar het is me nog steeds niet duidelijk wat je echt nodig hebt. Ik bedoelde niet onbeleefd te zijn, maar het zou echt kunnen helpen beide daadwerkelijke pogingen te vergeten en gewoon opnieuw proberen het werkelijke probleem en de relaties tussen de tabellen uit te leggen. Dat wil zeggen, als mijn tweede poging ook niet doet wat je nodig hebt. :)
toegevoegd de auteur GolezTrol, de bron
"Je zou het kunnen veranderen, maar blijkbaar moet je je aansluiten bij drie tabellen, waarbij de middelste tabel, subscriber_data, die ze allemaal met elkaar verbindt, optioneel is. Dat is niet echt logisch." Dat is precies wat ik wil. De query die u schreef, drukt nog steeds niet de null-waarden af.
toegevoegd de auteur user1017248, de bron
Sorry als ik arrogant klonk, ik wilde gewoon bedoelen dat wat ik wilde, echt was wat je zei. Eigenlijk zou ik in plaats van subscribers_data.fieldid subscribers_data.data krijgen, maar om te controleren of alle id's komen, gebruik ik de fieldid.
toegevoegd de auteur user1017248, de bron