Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
[SQL allgemein] Abfrage- Sortierung [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
[SQL allgemein] Abfrage- Sortierung


 
tombstone7
25-08-2003, 20:43 
 
Hi...

ich hoffe diese Abfrage lässt sich überhaupt realisieren und zwar...

habe ich ein Gästebuch, welches ich nun erweitern möchte um Kommentareinträge. Der Kommentareintrag soll (so angedacht) in der selben Tabelle erfolgen. Dafür ist das Attribut guestcommentID vorgesehen, der als Referenz auf guestID fungieren soll. Irgendwie muß man ja auch wissen, welcher Kommentar zu welchem EIntrag gehört. Das ganze soll halt so aussehen, daß die Abfrage die Einträge erst nach dem "Haupteintrag" sortiert und dann darauf die Kommentare folgen:

1.Eintrag
Kommentar
Kommentar

2. Eintrag

3. Eintrag
Kommentar
Kommentar



Hier die Tabelle zum besseren Verständniss:

CREATE TABLE guestbooktest (
guestID smallint(5) unsigned NOT NULL auto_increment,
guestdate date NOT NULL default '0000-00-00',
guesttext varchar(250) NOT NULL default '',
guestemail varchar(50) default NULL,
guestauthor varchar(30) NOT NULL default '',
guestcommentID smallint(5) unsigned NOT NULL default '0',
gueststatus char(1) NOT NULL default '1',
PRIMARY KEY (guestID)
) TYPE=MyISAM COMMENT='Gästebuch';


Realisierbar oder nicht? *bitte*bitte* :)

Danke

Gruß
TB

 
mrhappiness
25-08-2003, 20:51 
 
mach eine zweite tabelle für die kommentare und nimm die guestID da als fremdschlüssel

dann lässt sich das wunderbarst über joins realisieren

 
cst
26-08-2003, 17:14 
 
Original geschrieben von tombstone7
Hi...

ich hoffe diese Abfrage lässt sich überhaupt realisieren und zwar...
[...]

CREATE TABLE guestbooktest (
guestID smallint(5) unsigned NOT NULL auto_increment,
guestdate date NOT NULL default '0000-00-00',
guesttext varchar(250) NOT NULL default '',
guestemail varchar(50) default NULL,
guestauthor varchar(30) NOT NULL default '',
guestcommentID smallint(5) unsigned NOT NULL default '0',
gueststatus char(1) NOT NULL default '1',
PRIMARY KEY (guestID)
) TYPE=MyISAM COMMENT='Gästebuch';


Realisierbar oder nicht? *bitte*bitte* :)

Klar geht das, aber nicht mit der Tabelle. Du brauchst, wie auch mrhappiness schrieb, eine zweite Tabelle. Also:

1. Tabelle
CREATE TABLE guestbook (
ID smallint(5) unsigned NOT NULL auto_increment,
gbdate date NOT NULL default '0000-00-00',
text varchar(250) NOT NULL default '',
email varchar(50) default NULL,
author varchar(30) NOT NULL default '',
status char(1) NOT NULL default '1',
PRIMARY KEY (ID)
) TYPE=MyISAM COMMENT='Gästebuch';

2. Tabelle
CREATE TABLE guestbookcomment (
ID smallint(5) unsigned NOT NULL auto_increment,
gbID smallint(5) unsigned,
date date NOT NULL default '0000-00-00',
comment TEXT NOT NULL default '',
email varchar(50) default NULL,
author varchar(30) NOT NULL default '',
status char(1) NOT NULL default '1',
PRIMARY KEY (ID)
) TYPE=MyISAM COMMENT='Kommentare zum Gästebuch';

Da Du MyISAM nimmst, kannst Du nicht mit ForeignKeys arbeiten (na ja, logisch schon, aber ohne Automatismus). Also musst Du das entsprechend raussuchen.

a. Abfrage auf guestbook
b. Ausgabe des Datensatzes
c. gibt es in guestbookcomment einen Datensatz der Bedingung guestbookcomment.gbID = guestbook.ID erfüllt? Wenn ja, auslesen und ausgeben.
d. wieder oben anfangen, bis nichts mehr zu holen ist oder ein Zähler überläuft oder so... naja, das wirst Du schon selber wissen.

Alle Klarheiten beseitigt?
Christoph

code-tags by Abraxax

 
tombstone7
26-08-2003, 19:51 
 
schade, daß man das nicht direkt in einer Tabelle lösen kann....

ok...wie sieht dann die Abfrage aus? Mit den Joins hab ich es noch nicht so :dontknow:

Gruß

 
Abraxax
26-08-2003, 20:27 
 
klar kannst du das auslesen dann auch problemlos mittels JOIN lösen.

das ist sogar einfacher als viele weitere abfragen pro gb-eintrag zu machen.

CREATE TABLE guestbook (
gbID smallint(5) unsigned NOT NULL auto_increment,
gbdate date NOT NULL default '0000-00-00',
text varchar(250) NOT NULL default '',
email varchar(50) default NULL,
author varchar(30) NOT NULL default '',
status char(1) NOT NULL default '1',
PRIMARY KEY (ID)
) TYPE=MyISAM COMMENT='Gästebuch';

CREATE TABLE guestbookcomment (
ID smallint(5) unsigned NOT NULL auto_increment,
gbID smallint(5) unsigned,
date date NOT NULL default '0000-00-00',
comment TEXT NOT NULL default '',
email varchar(50) default NULL,
author varchar(30) NOT NULL default '',
status char(1) NOT NULL default '1',
PRIMARY KEY (ID)
) TYPE=MyISAM COMMENT='Kommentare zum Gästebuch';



SELECT
*
FROM
guestbook G
LEFT JOIN guestbookcomment C USING(gbID)

 
mrhappiness
26-08-2003, 20:28 
 
SELECT
e.eintrag_id, e.eintrag, k.kommentar_id, k.kommentar
FROM
eintragtabelle e
LEFT OUTER JOIN kommentartabelle k USING (eintrag_id)
ORDER BY e.datum DESC, k.datum DESCvoraussetzung:
primary keyin eintragtabelle: eintrag_id
foreignkey in kommentartabelle: eintrag_id

in beiden tabellen ne spalte datum die das erstellungsdatum beinhaltet@Abraxax
nich hauen bitte :)

 
Abraxax
26-08-2003, 20:30 
 
Original geschrieben von mrhappiness
@Abraxax
nich hauen bitte :) nö. habs auch grad gepostet.. ;)

 
tombstone7
26-08-2003, 23:16 
 
ok...funktioniert teilweise... schon mal schön

jetzt habe ich nur folgende Probleme:
1. wie erkenne ich nun bei der Abfrage jedes Datensatzes, ob es sich um ein Kommentar handelt? der soll nämlich eingerückt werden.

2. hatte im Vorfeld schon mal mit einer Tabelle gebastelt, welche komplett als Kommentar-Tabelle fungieren sollte..mittels eurer Hilfe klappt das ja auch soweit. nur kann ich dem USING (guestID) irgendwie klar machen, daß der Fremdschluessel nicht so heißt wie der Primärschlüssel aus der Guestbook-Tabelle?

refID (in KommentarTabelle) ---> Referenz auf guestID (im GB)

will in der KommentarTabelle noch Kommentare zu Events oder News speichern, daher sollte das alles allgemein gehalten werden.

Gruß
T

 
Abraxax
26-08-2003, 23:26 
 
zu 1. du musst prüfen, ob die hauptid sich ändern.

zu 2. entweder du bennenst die spalte bei den kommentaren passend um, was sinnvoller ist, da du dadurch genau weisst, welche spalten wie zusammengehören ....

oder du verwendest ON.

SELECT
*
FROM
guestbook G
LEFT JOIN guestbookcomment C ON (G.guestID = C.refID)

 
tombstone7
27-08-2003, 00:48 
 
zu 1.) meinst du mit HauptID die guestID? oder versteh ich da jetzt was falsch? experimentiere gerade mit der IF-Abfrage, aber führt immer zum falschen Ergebnis. Hier ein Bsp:

IF (!$row["comments.refID"]==$row["guestbook.guestID"])
// Haupt-Gästebuch-Eintrag - Formatierung
ELSE
// Kommentar-Eintrag - Formatierung




zu 2.) meine Güte. Da wär ich im Leben nicht drauf gekommen. An dieser Stelle muß einfach ein *herzliches Dankeschön* gesagt werden. Super. Da hätt ich noch Wochen dranngesessen und hätte es wahrscheinlich immer noch nicht... dann funktioniert das auch schonmal so wie ich es gerne hätte. fehlt nur noch Punkt 1. aber da fehlt mir jetzt die denkerische Ader zu später Stunde. *Zzzzzz*

Danke nochmals....
GRuß

 
Abraxax
27-08-2003, 09:08 
 
ja. ich meine mit der haupt-id die id der guestbook-tabelle. ;)

und was deine ausgabe betrifft, so musst du erst einmal einen temp-var haben. wenn du im forum mal suchst, findest du auch beispiele. ich will jetzt nicht noch einmal das machen, was eh schon über die suche gefunden werden kann.. :p

 
mukraker
27-08-2003, 09:14 
 
das mit left outer , left, right, etc joins habe ich noch nie verstanden, nicht hier und nicht in irgendwelchen anleitungen.

kann mir das einer mal versuchen einfach zu erklären ?

 
Abraxax
27-08-2003, 09:46 
 
@mukraker
suche mal im forum. da wurde das kürzlich erst beschrieben....

 
mrhappiness
27-08-2003, 10:40 
 
@tombstone7
unterscheiden ob es ein gästebucheintrag oder ein kommentar is, is übelst einfach, da dir das select zwei spalten liefert, einer für gb-eintrag, eine für kommentar und du weißt ja wohl welche du abfragst *g*

was etwas komplizierter ist, ist festzustellen ob ein datensatz zum ersten eintrag gehört oder ob es der zweite eintrag in deinem gästebuch ist$result=mysql_query('die abfrage');
$oldid=-454874;
while ($row = mysql_fetch_assoc($result))
{
if ($row['guestid'] != $oldid)
{
$oldid=$row['guestid'];
//Eintrag im Gästebuch: ausgeben
}
//Hier stehen die Kommentare: ausgeben
}

 
tombstone7
28-08-2003, 16:53 
 
hi,

danke, daß klappt alles nun wunderbar, aber ein kleines Problemche mit der Abfrage existiert noch...


$query="SELECT g.*, c.* FROM guestbooktest AS g
LEFT OUTER JOIN comments AS c ON (g.guestID = c.refID)
WHERE g.gueststatus=1 AND c.commentstatus=1 AND c.ref='$content'
ORDER BY g.guestdate DESC, c.commentdate ASC";


nun ist das Problem, daß er nur die Gästebuch-Einträge und Kommentare ausgibt, die auch welche haben. Das kommt wohl wegen (AND c.commentstatus=1 AND c.ref='$content').

Gibt es da eine elegante Möglichkeit, wie er auch die anderen (nicht kommentierten) GB-Einträge anzeigt mit den status-Feldern?

Gruß
T

 
mrhappiness
28-08-2003, 17:02 
 
lass das where mal weg und guck dir die ausgabe in phpmyadmin an

fehlt dir da was?

 
tombstone7
28-08-2003, 17:44 
 
meinst die ganze WHERE-Zeile weglassen? klar, dann kommt das richtige ergebnis raus, aber ich will die 3 felder noch überprüfen.

Ohne WHERE, aber den rest so belassen, kommt 'ne Fehlermeldung.

das ref-Feld ist für spätere Kommentare aus anderen Rubriken.
die Status-Felder, ob die Einträge angezeigt werden sollen oder nicht.

 
tombstone7
28-08-2003, 20:53 
 
habe gerade was rumexperimentiert, aber funktioniert immer noch nicht.
dachte mir, daß ich die 2 Möglichkeiten in der WHERE-Bedingung "abfrage".

Ist ja so, daß es einen gültigen Eintrag gibt, der Kommentare haben kann oder halt eben nicht (deswegen auch der Versuch mit NULL, in PHPAdmin stehen genau dann die Attributwerte der Kommentare auf NULL.)

Aber das Ergebnis bleibt gleich...wieso?


SELECT g.*, c.* FROM guestbooktest AS g
LEFT OUTER JOIN comments AS c ON (g.guestID = c.refID)
WHERE (g.gueststatus=1 AND c.commentstatus=1 AND c.ref='$content') OR (g.gueststatus=1 AND c.commentstatus=NULL AND c.ref=NULL)
ORDER BY g.guestdate DESC, c.commentdate ASC

hmmmm

 
mrhappiness
28-08-2003, 23:19 
 
auf NULL prüfst du nicht mit = sondern mit c.commentstatus IS NULL

 
tombstone7
29-08-2003, 00:53 
 
:D es funktioniert...jipiii...dankeschön für eure Hilfe!!!

einen kleinen bug hab ich noch, aber naja, das ist ein kleiner schönheitsfehler.

dankeschön & schönes Wochenende :)

:D :rocks:


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:34 Uhr.