Zählen über zwei Tabellen

Alice

Erfahrenes Mitglied
Hallo.

Ich bin mal wieder mit MySQL überfordert. Ich schnall es einfach nicht.

PHP:
// Festes Datum (heute) als Unix-Timestamp
$FixeTime = strtotime(date("Y-m-d").' 00:00:00')

// MySQL-Query
"SELECT COUNT(postid) AS Zahl FROM post WHERE dateline >= $FixeTime"

// dateline = Unix-Timestamp vom Beitrag (gepostet am...)

Ich möchte zählen wieviele neue Beiträge heute geschrieben wurden. Das klappt auch wunderbar.

...

Ich würde gerne jedoch zwischen "neuen Beiträgen" und "neuen Themen" unterscheiden. In der Tabelle "post" sind einfach alle Beiträge drin. Egal ob es eine "Antwort" oder der erste Beitrag eines Themas ist. Ich möchte nun prüfen, ob der Post auch der "First-Post" eines Threads ist. Wenn es so ist, soll der nicht mitgezählt werden. Die dazu benötigte Spalte heißt "firstpostid" in der Tabelle "thread".

Als Satz ausgedrückt:
ZÄHLE postid VON post WENN dateline >= heute UND postid != firstpostid
 
Mit ein wenig fummeln konnte ich einen funktionsfähigen Query auf die Beine stellen, aber dieser kommt mir etwas lahm vor.

Code:
"SELECT COUNT(postid) AS Zahl FROM post WHERE dateline >= $FixeTime AND postid NOT IN (select firstpostid from thread)"

Könnte man den Query optimieren?
 
join:

SQL:
SELECT
  COUNT(p.postid) AS zahl
FROM
  post p
LEFT OUTER JOIN
  thread t
ON
  p.postid = t.firstpostid
WHERE
  p.dateline >= $fixetime
  AND
  t.firstpostid IS NULL
;
 
Die Buchstaben "p" und "t" stehen vermutlich für den Anfangsbuchstaben der Tabelle richtig? Könnte man das auch anders schreiben?

Beispiel:
- COUNT(post.postid)
- COUNT(1.postid)
- thread 2

Eigentlich möchte ich wissen ob man einer bestimmten Regel folgen muss, oder ob es Sache des Programmierers ist.
 
Ich seh ein Join nicht nötig :/


SQL:
mysql_query("SELECT
  COUNT(tabelle1.postid) AS zahl
FROM
  post as tabelle1
,
  thread as tabelle2
WHERE
  tabelle1.postid = tabelle2.firstpostid
AND
  tabelle1.dateline >= ".$fixetime."
  AND
  tabelle2.firstpostid IS NULL");
 
:) Da hast du sicherlicht Recht mein Freund.

Nur mir wurde damals belehrt, dass ein JOIN-Befehlt zuerst immer das Kreuzprodukt der beiden Relationen bildet. Diese dannach durch die IDs verknümpft (oder wie immer man es haben möchte). Und mit meiner Variante würden die Relationen direkt eine Beziehung eingehen, und somit einer effinzientere Möglichkeit darstellen.

Achja, nehme kein Gewehr auf die Aussage :D Wurd mir damals so beigebracht als ich mal gerne wissen wollte was der Unterschied der beiden Möglichkeiten ist, zwei Tabellen zur verknümpfen!
 
:) Da hast du sicherlicht Recht mein Freund.

Nur mir wurde damals belehrt, dass ein JOIN-Befehlt zuerst immer das Kreuzprodukt der beiden Relationen bildet. Diese dannach durch die IDs verknümpft (oder wie immer man es haben möchte). Und mit meiner Variante würden die Relationen direkt eine Beziehung eingehen, und somit einer effinzientere Möglichkeit darstellen.

Achja, nehme kein Gewehr auf die Aussage :D Wurd mir damals so beigebracht als ich mal gerne wissen wollte was der Unterschied der beiden Möglichkeiten ist, zwei Tabellen zur verknümpfen!

Nein, der Explain Plan wird für beide Queries genau der gleiche sein. Es macht von der performance her keinen Unterschied ob man alte oder neue ANSI join Syntax verwendet.
 
Zurück