EKKi: IF in einem SELECT-Statement

Beitrag lesen

Mahlzeit Malcolm Beck´s,

Mit dem derzeitigen Model muss ich zuerst einmal die benötigte ID ermitteln, mit der ich arbeiten kann, also 2 SELECTs absetzen, nun dachte ich mir, dass man das vielleicht mit einem SELECT erledigen könnte.

Aber sicher sollte das gehen.

-- mit dem ersten SELECT ermittel ich die ID der aufgerufenen Seite

SELECT
       id
FROM
       content_linking  -- über content_linking.id verknüpfe ich alle benötigten Tabellen miteinander
WHERE
       content_linking.link_search_target = '" . $escape($SERVER['REQUEST_URI']) . "'

Einerseits möchte ich Dich auf [link:http://community.de.selfhtml.org/zitatesammlung/zitat1353@title=Zitat 1353] verweisen (woher sollen Deine Leser wissen, was in welcher Variable steht?) ...

-- Mit dieser ID kann ich dann weiter arbeiten
-- (verkürzte Version, Normalerweise spreche ich mit diesem SELECT mehr Felder an)

SELECT
       content, count(comments)
FROM
       content_linking, content
LEFT JOIN
       user_comments_db
ON
       user_comments_db.group_id = '" . $escape($SiteID) . "'  -- $SiteID muss ich vorher mit einem zusätzlichen SELECT ermitteln
WHERE
       content_linking.id = '" . $escape($SiteID) . "'
AND
       content.group_id = content_linking.id
GROUP BY
       content.group_id

  
... zum anderen ist diese Query unsauber: Du vermischt implizite und explizite JOIN-Syntax. Allein schon aus Gründen der Übersichtlichkeit solltest Du das nicht tun - ganz davon abgesehen, dass dadurch evtl. unerwartete Ergebnisse zustandekommen. Dir Frage ist: was willst Du?  
  
Ich versuche mal, Deine Versuche zu "begradigen":  
  
~~~sql
SELECT content                                         -- Gib mir den Inhalt  
,      count(comments) AS anzahl_comments              -- und die Anzahl der Kommentare  
  FROM content_linking       cl                        -- aller Datensätze aus der Tabelle "content_linking"  
  LEFT JOIN content          c  ON cl.id = c.group_id  -- verknüpft mit der Tabelle "content"  
  LEFT JOIN user_comments_db uc ON cl.id = uc.group_id -- verknüpft mit der Tabelle "user_comments_db"  
 WHERE cl.link_search_target = 'foobar'                -- bei denen das Feld "link_search_target" den gewünschten Inhalt hat  
 GROUP BY content                                      -- und gruppiere nach dem Inhalt

Du solltest nur Felder selektieren, nach denen Du auch gruppierst. Umgekehrt solltest Du nach allen Feldern gruppieren, bei deren Selektion Du keine Aggregatsfunktion benutzt. MySQL ist da zwar tolerant, kann aber auch unerwartete Ergebnisse bringen: wenn Du die Datensätze nach der "content.group_id" gruppierst, woher soll das DBMS wissen, welchen der ggf. mehrfach vorkommenden "content" Du als Ergebnis haben möchtest?

SELECT

content, count(comments)
FROM
       content_linking, content
LEFT JOIN
       user_comments_db
ON
       user_comments_db.group_id = content_linking.id  -- Das funktioniert nicht, da ich content_linking.id erst nach der WHERE-Klausel kenne

Nein - das funktioniert deshalb nicht, weil offenbar explizite JOIN-Syntax vor impliziter behandelt wird. Dein DBMS verknüpft anscheinend erst die Tabelle "content" mit der Tabelle "user_comments_db" ... und dabei sind natürlich Spalten aus der Tabelle "content_linking" noch nicht bekannt. Das ist das, was ich weiter oben meinte: sorge dafür, dass Deine SQL-Syntax sauber ist und vermeide die Vermischung von expliziter und impliziter JOIN-Syntax!

WHERE
       content_linking.link_search_target = '" . $escape($SERVER['REQUEST_URI']) . "'
AND
       content.group_id = content_linking.id
GROUP BY
       content.group_id

  
  
MfG,  
EKKi  

-- 
sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|