You are not logged in.

  • Login

1

Thursday, August 2nd 2007, 5:10pm

last_insert_id

Hallo,

ich habe eine Problem, oder ich versteh was falsch ( was auch durchaus im Bereich des möglichem liegt)

Ich habe eine Tabelle

SQL Code

1
2
3
4
5
TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tid` int(11) NOT NULL,
  `text` text collate latin1_german1_ci,
  PRIMARY KEY  (`id`)


und möchte nun ein Datensatz einfügen, der "id" Wert wird automatisch hoch gezählt. Der Wert "tid" soll auch nun den Wert von "id" bekommen.

So habe ich mir das gedacht :

SQL Code

1
2
3
4
INSERT INTO `test` ( `id` , `tid` , `text` )
VALUES (
NULL , LAST_INSERT_ID( ) , 'Test'
);


Eigentlich sollte nun bei "tid" der wert von "id" stehen oder nicht? Würde nur ungerne ein zweite SQL Anweisung schreiben die dann das Feld "tid" mit den Wert füllt.

Gruß
Stephan

2

Thursday, August 2nd 2007, 5:18pm

du kannst das in deiner datenbank einstellen auto_increment. dann wird der wert immer um eins nach oben gesetzt wie auch bei id selber.

was mich aber dann zur Frage führt. warum machst du sowas?

3

Thursday, August 2nd 2007, 6:14pm

Es soll ja nicht immer den gleich wert haben. Nur wenn ich in die SQL Anweisung LAST_INSERT_ID() übergebe für den Wert "tid".

Ganz ganz soll für ein Forum werden. ID ist vorlaufend und der thread id wir den ersten neuen Eintrag hinzugfügt.

z.b.

id = 5 pid = 0 tid=5 Thread "Hallo"
id = 6 pid = 1 tid=5 Thread "Hallo" Antwort
id = 7 pid = 0 tid=7 Thread "Hallo Welt"

usw.

ich hoffe das System Funktioniert auch, bin grade dabei das zu Implementieren :-)

4

Friday, August 3rd 2007, 1:09am

Du verstehst da glaube ich etwas falsch.
Benutzt du phpMyAdmin?

Und auch andernfalls kannst du bereits beim erstellen der Datenbankstruktur angeben, dass MySQL für eine Spalte in einer Datenbank eine Zahl einfügt, die bei jedem Eintrag um einen erhöht wird (auto_increment). So brauchst du gar keine id mehr von PHP aus zu übergeben und kannst dich um die anderen Inhalte kümmern, was natürlich auch dafür sorgt, dass die id immer eine andere ist.

5

Friday, August 3rd 2007, 1:28am

Die "ID" ist auch nicht das Problem sondern "tid". Ich möchte gerne wenn

z.B.

ID=5, pid=0 und tid=5 = Neuer Beitrag im Forum
ID=6, pid=6 und tid=5 = Antwort auf neuer Beitrag im Forum

ich kann das natürlich in zwei SQL Anweisung machen, aber ich hätte das gern in einer.

6

Friday, August 3rd 2007, 9:46am

Ich denke, dass musst du in zwei Schritten machen. Bin zwar kein SQL-Pro, mir ist aber auch keine Funktion dafür bekannt..

7

Friday, August 3rd 2007, 10:13am

Quoted from ""Matrixstyle""

Die "ID" ist auch nicht das Problem sondern "tid". Ich möchte gerne wenn

z.B.

ID=5, pid=0 und tid=5 = Neuer Beitrag im Forum
ID=6, pid=6 und tid=5 = Antwort auf neuer Beitrag im Forum

ich kann das natürlich in zwei SQL Anweisung machen, aber ich hätte das gern in einer.


Hallo,

Du solltest Dein Konzept evtl. nochmal überdenken:

Warum muss im ersten Beispiel tid=5 sein? Warum nicht einfach auf 0 setzten?
Das ist ja eigentlich eine einfache hierachische Struktur, wo jede Antwort einen Vater (tid) hat. Der Vater selbst ist ein "Root-Objekt" und hat keinen Vater => tid=0.

BTW was ist denn "pid"?

melwood

8

Friday, August 3rd 2007, 12:40pm

Mit dem Konzept bin ich mir auch noch nicht so ganz schlüssig! Aber dein Ansatz verstehe ich nicht ganz!

Quoted

Warum nicht einfach auf 0 setzten?
Das ist ja eigentlich eine einfache hierachische Struktur, wo jede Antwort einen Vater (tid) hat. Der Vater selbst ist ein "Root-Objekt" und hat keinen Vater => tid=0.


Also das ob war nur ein Beispiel für Last_insert_id()

Die Tabelle hat am Anfang 3 Spalten mit ID, pid,tid wobei p=posting,t=thread steht.
Die pid kann man erstmal vernachlässigen.

ID ist immer vorlaufend und tid beschriebt ein neuen Beitrag im Forum der sich bei jedem posting nicht ändert. Um das zu erkennen habe ich mir gedacht das Wenn ID = tid ist, handelt es sich um den Anfang eines neuen Beitrags. Aber über andere Denkansätze wäre ich nicht abgeneigt.

Gruß
Stephan

9

Friday, August 3rd 2007, 2:23pm

Re: last_insert_id

Quoted from ""Matrixstyle""


So habe ich mir das gedacht :

SQL Code

1
2
3
4
INSERT INTO `test` ( `id` , `tid` , `text` )
VALUES (
NULL , LAST_INSERT_ID( ) , 'Test'
);


Eigentlich sollte nun bei "tid" der wert von "id" stehen oder nicht? Würde nur ungerne ein zweite SQL Anweisung schreiben die dann das Feld "tid" mit den Wert füllt.


http://dev.mysql.com/doc/refman/5.0/en/mysql-insert-id.html

Die Idee mit der Referenzierung der Zeilen ist garnicht so schlecht (imho). Du musst nur "von Hand" speichern zu welchem original Post dieser Post gehört. So etwas kannst du nicht mit MySQL eigenen Mitteln lösen.

10

Friday, August 3rd 2007, 2:30pm

Quoted from ""Matrixstyle""

Mit dem Konzept bin ich mir auch noch nicht so ganz schlüssig! Aber dein Ansatz verstehe ich nicht ganz!

Die Tabelle hat am Anfang 3 Spalten mit ID, pid,tid wobei p=posting,t=thread steht.
Die pid kann man erstmal vernachlässigen.

ID ist immer vorlaufend und tid beschriebt ein neuen Beitrag im Forum der sich bei jedem posting nicht ändert. Um das zu erkennen habe ich mir gedacht das Wenn ID = tid ist, handelt es sich um den Anfang eines neuen Beitrags. Aber über andere Denkansätze wäre ich nicht abgeneigt.


Also:

ID=25, tid=0 = Neuer Beitrag im Forum
ID=40, tid=25 = Antwort auf Beitrag 25
ID=47, tid=40 = Antwort auf Beitrag 40
ID=50, tid=25 = Antwort auf Beitrag 25

Einträge deren tid = 0 sind neue Beiträge (Anfang eines neuen Beitrags)
Beiträge deren tid > 0 sind sind Antworten auf einen Beitrag

Mit einer rekursiven Funktion kannst Du die Stuktur durchlaufen und hierarchisch ausgeben.

Aus performance Gründen wäre es evtl noch nützlich eine Sortierung und die Id des ersten Beitrags mit zu speichern, dann kannst Du Beiträge mit einem Querry flach aus der DB holen aund ausgeben:

ID=25, tid=0, sort=1, root=0 = Neuer Beitrag im Forum
ID=40, tid=25, sort=2, root=25 = Antwort auf Beitrag 25
ID=47, tid=40, sort=3, root=25 = Antwort auf Beitrag 40
ID=50, tid=25, sort=4, root=25 = Antwort auf Beitrag 25

Flach:

HTML Code

1
2
3
4
Beitrag 25
Beitrag 40
Beitrag 47
Beitrag 50


Hierarchisch:

HTML Code

1
2
3
4
Beitrag 25
    Beitrag 40
        Beitrag 47
    Beitrag 50


melwood

11

Friday, August 3rd 2007, 3:17pm

Teil 1 habe ich soweit verstanden, anstatt gleich mit tid auf den gleichen wert wie id zusetzen, wird 0 gesetzt. Ansonsten ist es gleich richtig, wie meine Vorschlag?

zum zweiten Teil, muss ich wieder sagen. Das verstehe ich leider nicht :(

Für was ist Sort und root?


Gruß
Stephan

12

Friday, August 3rd 2007, 3:36pm

Quoted from ""Matrixstyle""

Teil 1 habe ich soweit verstanden, anstatt gleich mit tid auf den gleichen wert wie id zusetzen, wird 0 gesetzt. Ansonsten ist es gleich richtig, wie meine Vorschlag?

zum zweiten Teil, muss ich wieder sagen. Das verstehe ich leider nicht :(

Für was ist Sort und root?


Gruß
Stephan


'sort' ist eine Zahl die hoch gezählt wird [INSERT INTO test (..., sort) VALUES(...,sort+1)], also die Sortierung.
'root' is die Id des ersten Beitrags (im meinem Bsp hat der die Id 25).

Dadurch kannst Du alle Beiträge mit einem Query flach aus der Db holen:


PHP Quellcode

1
2
3
4
5
6
7
8
9
$strQuery = '
		SELECT
			*
		FROM
			test
		WHERE
			root = 25
		ORDER BY
			sort';


Die flache Darstellung entspricht dem was Du z.B. hier im Forum siehst.
Willst Du aber einen Thread-Tree darstellen, wie es ihn z.B. im heise Forum gibt, dann brauchst du eine hierachische Struktur.

Mit meinem Vorschlag sollte sich beides recht leicht umsetzen lassen...

melwood

13

Thursday, August 9th 2007, 1:15pm

Noch zwei kleine Anmerkungen:

1) Warum bei einem Rooteintrag 0 speichern? Das ist nur notwendig wenn die Spalte mit NOT NULL defniert ist. Wenn es keine Info gibt solltest du NULL reinschreiben.

2) Die Sortierung kannst du bei einem Forum doch durch die Zeit realisieren. aAlso beim INSERT einfach date_created=NOW() und beim SELECT ein ORDER BY date_created verwenden.

14

Thursday, August 9th 2007, 2:47pm

Die Sortierung kannst du bei einem Forum doch durch die Zeit realisieren. aAlso beim INSERT einfach date_created=NOW() und beim SELECT ein ORDER BY date_created verwenden.

Das ist aber sehr oft nicht gewünscht. Wichtig ist es meistens, dass eine einigermaßen feste Struktur erhalten bleibt. Threads kommen vielleicht täglich neue dazu, die Foren jedoch ändern sich nicht, sodass man hier meistens vorsortieren möchte. Ich habe auch die Erfahrung gemacht, dass diese Technik handlicher ist.

15

Saturday, August 11th 2007, 11:34am

Da hatte ich was falsch verstanden. Ich dachte es ginge um die Sortierung der Posts in einem Thread.

Similar threads

Social bookmarks