Ik probeer wat data uit drie verschillende tabellen te joinen maar kom er niet precies uit hoe dat moet.

Eerst wat afbeeldingen van de database structuur:

Dit is de basis tabel:

Alleen 'id' is hier belangrijk.



'snm_fieldsandfilters_connections'

Hier is 'element_id' belangrijk die is dezelfde waarde als 'id' in de volgende tabel



'snm_fieldsandfilters_elements'

Hier is het 'item_id' belangrijk, die is hetzelfde als 'id' bij snm_content



Hoe kan ik deze tabellen mergen in 1 array resultaat?

Stel ik maak een nieuw artikel aan (snm_content tabel), die heeft id 4, dan komt er een nieuwe row in 'snm_fieldsandfilters_connections' met 'element_id' 22 die is hetzelfde als het 'id' in 'snm_fieldsandfilters_elements' en het 'item_id' in die tabel is weer hetzelfde als 'id' in 'snm_content'.

Op die manier wil ik het 'field_value_id' koppelen aan het 'id' van een artikel in 'snm_content'.

Hoe kan ik dit het beste doen?

Ik dacht eerst dat ik er was met de volgende query:

<?
SELECT snm_content.*, snm_fieldsandfilters_connections.element_id, snm_fieldsandfilters_connections.field_value_id, snm_fieldsandfilters_elements.id
FROM snm_content
LEFT JOIN snm_fieldsandfilters_elements
ON snm_fieldsandfilters_connections.element_id=snm_fieldsandfilters_elements.id
LEFT JOIN snm_fieldsandfilters_connections
ON snm_content.id=snm_fieldsandfilters_connections.element_id
WHERE snm_content.catid IN ('10')
ORDER BY snm_content.ordering LIMIT 0,4
?>

Maar dat werkte toch niet.
zet de regels 4 en 5 eens onder 6 en 7

Je ON clause op regel 6 zoekt namelijk iets in de connections tabel, maar die heb je daarboven nog niet gebruikt.

Ivo P op 10/06/2016 14:35:42

zet de regels 4 en 5 eens onder 6 en 7

Je ON clause op regel 6 zoekt namelijk iets in de connections tabel, maar die heb je daarboven nog niet gebruikt.



Dit geeft NULL NULL NULL bij de rijen: element_id field_value_id en id

Als ik uit een dropdown een selectie maak is dat 20 tot en met 37 (dat is het field_value_id) dat field value zit dus niet rechtstreeks gekoppeld aan snm_content (waar mijn artikelen staan opgeslagen) maar in snm_fieldsandfilters_connections, daar is het element_id hetzelfde als het id in snm_fieldsandfilters_elements waarin item_id wel weer hetzelfde is als id in snm_content.

Dus eigenlijk moet ik via een omweg id in snm_content vergelijken met item_id in snm_fieldsandfilters_elements. En daarbij het bijbehorende field_value_id ophalen.

SELECT 
  snm_content.*, 
  c.element_id, 
  c.field_value_id, 
  e.id
FROM snm_content
LEFT OUTER JOIN snm_fieldsandfilters_elements AS e ON e.item_id = snm_content.id
LEFT OUTER JOIN snm_fieldsandfilters_connections AS c ON c.element_id = e.id 
snm_content.catid IN ('10') 
ORDER BY snm_content.ordering LIMIT 0,4


Regel 7 koppelt elements aan content via item_id en id
Regel 8 koppelt connections aan elements via element_id en id
Om te verkorten heb ik alias e en c geïntroduceerd.
Jan de Laet op 11/06/2016 14:48:20


SELECT 
  snm_content.*, 
  c.element_id, 
  c.field_value_id, 
  e.id
FROM snm_content
LEFT OUTER JOIN snm_fieldsandfilters_elements AS e ON e.item_id = snm_content.id
LEFT OUTER JOIN snm_fieldsandfilters_connections AS c ON c.element_id = e.id 
snm_content.catid IN ('10') 
ORDER BY snm_content.ordering LIMIT 0,4


Regel 7 koppelt elements aan content via item_id en id
Regel 8 koppelt connections aan elements via element_id en id
Om te verkorten heb ik alias e en c geïntroduceerd.


Top! Ik had hem zelf al gefixed met een soortgelijke query. Duurde een paar uur maar ik kreeg hem uiteindelijk door. Thanks.

Reageren