SQL - Abfrage Join mit multivalue field
am 06.07.2012 - 14:46 Uhr in
Hallo,
Ich versuche gerade eine eigene recht komplexe SQL Abfrage auf die Beine zu stellen, leider scheitert es gerade an einer Kleinigkeit. Diese könnte ich natürlich auch in eine extra Abfrage stecken, aber ich denke es sollte auch mit nur einer Abfrage funktionieren.
Folgendes Szenario:
Beteiligte Node-types:
-Koordinaten
-Spioberichte
-Spieler
als Primäre Abfrage verwende ich Spionageberichte und mit LEFT JOINS füge ich einige weitere Infos aus dem entsprechenden Koordinaten-node und aus dem Spieler-node hinzu.
Hauptproblem:
- Spieler-node enthält ein Multivalue Feld (3 Einträge)
- diese 3 Einträge möchte ich aber gerne in einer Row des Ergebnisses haben
Nebenproblem:
- Eigentlich möchte ich nur den aktuellsten Spiobericht zu bestimmten Koordinaten haben
- Dies löse ich aktuell dann im PHP-Code
Ich nehme mal an, dass jemand schonmal vor dem gleichen Problem stand, leider konnte ich der Suche nichts entsprechendes entlocken.
Gruß
Sawascwoolf
P.s. hier noch das aktuelle Query (Tabellen-prefix: first)
SELECT
time.field_time_value as time,
node.nid as nid,
holz.field_holz_value AS holz,
wasser.field_wasser_value AS wasser,
iri.field_iri_value AS iri,
sauer.field_sauer_value AS sauer,
name.title AS name,
verteidigung.field_verteidigung_value AS verteidigung,
punkte.field_punkte_value AS punkte,
einheiten.field_einheiten_value AS einheiten,
ally.field_allianz_value AS ally,
land.field_land_value AS land,
konti.field_kontinent_value AS konti,
stadt.field_koords_stadt_value AS stadt,
koords.field_verteidiger_koords_target_id AS vert_id
FROM firstnode as node
LEFT JOIN firstfield_data_field_holz as holz ON node.nid = holz.entity_id
LEFT JOIN firstfield_data_field_iri AS iri ON node.nid =iri.entity_id
LEFT JOIN firstfield_data_field_sauer AS sauer ON node.nid = sauer.entity_id
LEFT JOIN firstfield_data_field_wasser AS wasser ON node.nid = wasser.entity_id
LEFT JOIN firstfield_data_field_verteidiger AS verteidiger ON node.nid = verteidiger.entity_id
LEFT JOIN firstfield_data_field_einheiten AS einheiten ON node.nid = einheiten.entity_id
LEFT JOIN firstfield_data_field_verteidigung AS verteidigung ON node.nid = verteidigung.entity_id
LEFT JOIN firstfield_data_field_time AS time ON node.nid = time.entity_id
LEFT JOIN firstfield_data_field_punkte AS punkte ON node.nid = punkte.entity_id
LEFT JOIN firstfield_data_field_verteidiger_koords AS koords ON node.nid = koords.entity_id
LEFT JOIN firstfield_data_field_allianz AS ally ON verteidiger.field_verteidiger_target_id = ally.entity_id
LEFT JOIN firstfield_data_field_is_friend AS friend ON verteidiger.field_verteidiger_target_id = friend.entity_id
LEFT JOIN firstnode AS name ON verteidiger.field_verteidiger_target_id = name.nid
LEFT JOIN firstfield_data_field_kontinent AS konti ON koords.field_verteidiger_koords_target_id = konti.entity_id
LEFT JOIN firstfield_data_field_land AS land ON land.entity_id = koords.field_verteidiger_koords_target_id
LEFT JOIN firstfield_data_field_koords_stadt AS stadt ON stadt.entity_id = koords.field_verteidiger_koords_target_id
LEFT JOIN firstfield_data_field_waffentechs AS techs ON name.nid = techs.entity_id
WHERE (node.type LIKE 'spio_bericht' AND time.field_time_value > 1341219112 AND friend.field_is_friend_value != 1 AND konti.field_kontinent_value IN (1))
ORDER BY time.field_time_value DESC- Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Sawascwoolf,zu Deinem
am 09.07.2012 - 20:58 Uhr
Hallo Sawascwoolf,
zu Deinem Hauptproblem:
Wenn Du 3 Zeilen einer Tabelle in deiner Abfrage in 3 Spalten darstellen möchtest, musst Du die Tabelle 3 x mit einem Left-Join einbinden.
Bei Drupal-Fields gibt es immer noch eine Spalte delta.
Hier ein Beispiel: firstfield_data_field_einheiten enthält das multivalue-fields (kann aus deinem Text oben nicht herauslesen, um welche Tabelle es sich handelt, daher nehme ich diese). Dann musst Du wie folgt einbinden:
SELECT...
einheiten1.field_einheiten_value AS einheiten1,
einheiten2.field_einheiten_value AS einheiten2,
einheiten3.field_einheiten_value AS einheiten3,
...
FROM firstnode as node
LEFT JOIN ...
LEFT JOIN firstfield_data_field_einheiten AS einheiten1 ON node.nid = einheiten.entity_id AND delta=0
LEFT JOIN firstfield_data_field_einheiten AS einheiten2 ON node.nid = einheiten.entity_id AND delta=1
LEFT JOIN firstfield_data_field_einheiten AS einheiten3 ON node.nid = einheiten.entity_id AND delta=2
LEFT JOIN ...
WHERE ...
Hoffe, dass ist einigermaßen verständlich...
Zu Deinem Nebenproblem:
Wie definiest Du den aktuellsten Spiobericht? Kann man mit Sicherheit auch per SQL lösen.
Grüße,
Tobias