PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL: eine dritte Tabelle zählen lassen


MadMan2k
2004-09-12, 21:48:27
hallo, ich habe eine Tabelle mit (News)Threads welche ich mir über einen SELECT Query ausgeben lasse.

Die Anzahl der darauf bezogenen Antworten bekomme ich momentan, indem ich in der WHILE Schleife pro Eintrag einen COUNT(*) Query losschicke.

Könnte man das nicht schon im Hauptquery erledigen?

dieser sieht im Moment wie folgt aus:


$sql = "SELECT
DATE_FORMAT(entry_header.date, '%d.%m.%y') AS format_date,
entry_header.title,
entry_content.text,
entry_header.author_id
FROM tree
LEFT JOIN entry_header ON tree.id = entry_header.tree_id
LEFT JOIN entry_content ON tree.id = entry_content.tree_id
WHERE tree.parent_id = " . $_GET['id'] . "
ORDER BY date DESC";

Jojo
2004-09-12, 23:13:40
Kann diese MySQL Version sub-selects?

MadMan2k
2004-09-13, 13:31:42
Kann diese MySQL Version sub-selects?
kA, hab MySQL 4.0.20d drauf...

aber wenn, wäre das dann performanter als jedesmal nen Query in der Schleife abzuschicken?

und nochmal für die anderen zur leichterem Verständniss:


"SELECT id, titel, text FROM nachrichten WHERE parent_id = foo"

while($entry = mysql_fetch_assoc($result)) {
"SELECT COUNT(*) FROM nachrichten WHERE parent_id =" . $entry['id']
}

//das ganze irgendwie in einen Query unterbringen?

HellHorse
2004-09-13, 13:56:27
Leider habe ich das Problem und das Schema nicht vollständig geschnallt, aber schon mal an GROUP BY gedacht?
So wie ich das sehe, müsste es parent_id sein.

MadMan2k
2004-09-13, 14:48:04
Leider habe ich das Problem und das Schema nicht vollständig geschnallt, aber schon mal an GROUP BY gedacht?
So wie ich das sehe, müsste es parent_id sein.
ich sollte vielleciht dazu sagen, dass ich mir den ganzen Scheiss selbst beibringe und so bestimmte grundlegende Sachen übersehen haben kann...

ok, ich versuchs nochmal von vorne:

ich will am ende folgendes Ergebniss haben:


Titel | Text | Anzahl der Kommentare
=======================================
erste News | hallo dies ist... | 3

titel und text bekomme ich über den Left Join zusammen, doch für die Anzahl der Kommentare müsste ich dieselbe Tabelle nochmal auslesen, doch diesmal die Einträge mit "parent_id = eintrag_id" anstatt "parent_id = news_id" nehmen.

Das ganze ist nämlich eine Baumstruktur nach parentID System


Main
/ \
News
/ \
Eintrag1
/ \
Kommentar1

usw.


die Struktur habe ich dabei in der tabelle tree(id, parent_id) stehen, auf die sich alle anderen tabellen beziehen.

Nase
2004-09-13, 15:41:31
Ich will jetzt nicht deine Tabellenstruktur übernehmen, weil die für mich nicht ganz durchsichtig ist.

Du hast also zwei Tabellen. Eine Tabelle für die Nachrichten, eine andere für die Kommentare. Aus Tabelle1 willst du den Titel und den Text der Nachricht auslesen. Zudem willst du wissen, wieviele Kommentare zu dieser Nachricht vorhanden ist.

SELECT news.title, news.text, COUNT(kommentar.id) FROM news, kommentar WHERE news.id = kommentar.newsid GROUP BY news.id
So würde ich das machen.

MadMan2k
2004-09-13, 17:11:45
damit hab ich ein paar Probleme

1. ich werd aus der beschreibung von GROUP BY auf mysql.com nicht so rech schlau.
Aber sofern ich das verstehe ist das dafür da, damit nur die news einträge liefert und keinen cross join mit kommentare macht.

2. ist mein aktueller query etwas anders aufgebaut, sodass ich Probleme hab ihn anzupassen.
Am besten geb ich mal das komplette Tabellenlayout:

tree(id, parent_id)
entry_header(tree_id, title)
entry_content(tree_id, text)

wenn ich jetzt alle News haben will, muss ich aus tree alle Einträge mit der "parent_id = 2"(News Knoten) auslesen und an deren id entry_header und entry_content per tree_id joinen.
Die WHERE bedingung geht also schon für "parent_id = 2" drauf.

Wenn ich nun die anzahl der kommentare haben will müsste ich wieder tree auslesen - diesmal allerdings mit "tree.parent_id = tree.id"
Kommentare Newseintrag

wenn meine eigene Syntax zulässig wäre würde ich das so formulieren:


SELECT
tree.id,
entry_header.title,
entry_content.text,
COUNT(tree.id) WHERE tree.parent_id = tree.id
FROM tree
LEFT JOIN entry_header ON tree.id = entry_header.tree_id
LEFT JOIN entry_content ON tree.id = entry_content.tree_id
WHERE tree.parent_id = 2

Nase
2004-09-13, 17:22:32
Tipp: Du kannst mehrere Bedingungen unter WHERE per && zusammenfassen.
Beispiel:[code]SELECT news.text, kommentar.text FROM news, kommentar WHERE news.id =1 && kommentar.id = 2[code]
Damit würdest du alle Datensätze auslesen, bei denen die ID in der Tabelle News gleich 1 und die ID in der Tabelle Kommentar gleich 2 ist. Zwar kein tolles Beispiel, aber verdeutlicht wohl das, was ich sagen will.

Group by fasst übrigens gleiche Datensätze zusammen. Z.B. kannst du Datensätze, die die gleich ID haben, zusammenfassen, damit dieser beim Auslesen nicht doppelt vorkommen.

MadMan2k
2004-09-14, 13:03:28
Group by fasst übrigens gleiche Datensätze zusammen. Z.B. kannst du Datensätze, die die gleich ID haben, zusammenfassen, damit dieser beim Auslesen nicht doppelt vorkommen.
thx, so langsam kapiere ich deinen Query :)

Tipp: Du kannst mehrere Bedingungen unter WHERE per && zusammenfassen.
AND kenne ich natürlich - allerdings kann ich das aufgrund meiner Datenbankstruktur hier schlecht machen:

SELECT (...) WHERE tree.parent_id = news AND tree.parent_id = tree.id

MadMan2k
2004-09-18, 19:33:27
ok, ich habs jetzt einfach in der schleife gelassen - geht wohl nicht anders.

Dafür hab ich ein neues Problem: :D

ich möchte alle Einträge aus Tabelle a haben, die nicht in Tabelle b sind.
Das ganze wird ebenfalls über die id geprüft.

soweit bin ich gekommen:


SELECT tree.id
FROM tree
LEFT JOIN menu ON tree.id = menu.tree_id
WHERE tree.parent_id = 2 AND menu.tree_id = NULL


hierbei gibt er mir gar nix aus

alternativ hab ich auch folgendes probiert:


SELECT tree.id
FROM tree, menu
WHERE tree.parent_id = 2 AND tree.id != menu.tree_id
GROUP BY tree.id

hier gibt er mir auch die Einträge bei denen "tree.id == menu.tree_id"
:|

Nase
2004-09-18, 19:40:08
Schmeiss doch einfach dieses tree-Tabelle raus. Die macht alles nur kompliziert.

MadMan2k
2004-09-18, 23:02:14
Schmeiss doch einfach dieses tree-Tabelle raus. Die macht alles nur kompliziert.
wie soll ich denn die Seitenstruktur sonst speichern?
Diese soll Baumartig und unendlich verzweigbar sein.
ergo:
- jeder Eintrag kann inhaltslos, sprich nur zu Strukturierung sein
- jeder Eintrag kann mehrere Inhalte(Seiten) haben
- jeder Eintrag mit Inhalt soll kommentierbar sein
- jeder Eintrag kann ein eigenes Modul zur Darstellung mitbringen

ansonsten sollte es doch möglich sein die Komplementärmenge zweier Tabellen zu bekommen...