Hulp nodig met een query
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?
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
?>
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.
Gewijzigd op 10/06/2016 13:37:20 door Snelle Jaap
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.
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
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
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.
Gewijzigd op 11/06/2016 14:51:26 door Jan de Laet
Jan de Laet op 11/06/2016 14:48:20:
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
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
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.