Toon posts:

[php] query probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit even helemaal vast met een script wat ik aan het maken ben. Ik wil de laatste 9 reacties die op mijn site geplaatst als output krijgen. Wat me nu niet lukt is om de juiste titel's te vinden bij de links en om er voor te zorgen dat elk bericht maar 1x wordt weergegeven in het lijstje.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?
 include "dbconfig.php";
 mysql_connect($dbhost, $dbuser, $dbpassword);
 $query = "SELECT * FROM reacties order by id DESC LIMIT 0, 9";
 $result = mysql_db_query($dbname, $query);

 if ($result)
{

    while ($r = mysql_fetch_array($result))
        {
            $id = $r["id"];
            $date = date ("H:i", $r['date']);
            $cato = $r["cato"];
            $nieuws_id = $r["nieuws_id"];

if($cato == "1") {
$link = "tweaks.php?page=bekijk&id=$nieuws_id";
}
if($cato == "2") {
$link = "downloads.php?page=bekijk&id=$nieuws_id";
}
if($cato == "3") {
$link = "reviews.php?page=bekijk&sub=tutorial&art_id=$nieuws_id&id=1";
}
if($cato == "4") {
$link = "tutorials.php?page=bekijk&sub=tutorial&art_id=$nieuws_id&id=1";
}
if($cato == "5") {

$link = "nieuws.php?page=bekijk&id=$nieuws_id";
}
if($cato == "6") {
$link = "casemods.php?page=bekijk&id=$nieuws_id";
}
if($cato == "7") {
$link = "poll.php?id=$nieuws_id";
}
if($cato == "8") {
$link = "extra.php?page=crew&id=$nieuws_id";
}
if($cato == "9") {
$link = "scripts.php?page=bekijk&id=$nieuws_id";
}
            echo "$date <a href=\"$link\">$titel</a><br>";
        }
}
?>


Dit is me script tot nu toe. Als output krijg ik de laatste 9 berichten met de juiste datum en de juiste link naar het echte bericht maar niet de titel en soms staat dingen er dus dubbel tussen als er 2x achterelkaar gereplied is op het zelfde bericht. Wie kan me verder helpen?

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Doet iets met Cloud (MS/IBM)


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
hoe zie je database er uit?

Verwijderd

Topicstarter
marty schreef op 22 augustus 2002 @ 15:35:
hoe zie je database er uit?
Reacties tabel is id,nieuws_id,cato,naam,bericht,date,ip

Bij de andere tabellen waar script, nieuws, downloads enzo instaan is het id en dan titel of title.

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Is "group by" niet beter?

oneee:
Misschien een los staande tip, dit heeft nix te maken met jouw huidige probleem.
Maar kijk eens bij
http://nl.php.net/switch
of
http://nl.php.net/manual/nl/control-structures.elseif.php


Lees dit ook eens door... http://gerard.yoursite.nl/got/php-tiplist

Programmer - an organism that turns coffee into software.


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
foutje, las het verkeerd

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
In welke tabel staat de titel die uniek moet zijn in het resultaat?
Je zult mbv een join deze titel erbij moeten zoeken en vervolgens mbv distinct de dubbelen eruit halen.

Never underestimate the power of


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

[nohtml]
LuCarD schreef op 22 augustus 2002 @ 15:44:
[...]


Is "group by" niet beter?
ws wel
maar als ie distinct al niet kent :X

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
nieuws_id is het ID van het nieuws,dowload,tweak enz bericht waar het naar toe moet gaan.. id is het ID van de reactie...

Verwijderd

Topicstarter
cameodski schreef op 22 augustus 2002 @ 15:46:
In welke tabel staat de titel die uniek moet zijn in het resultaat?
Je zult mbv een join deze titel erbij moeten zoeken en vervolgens mbv distinct de dubbelen eruit halen.
in 9 verschillende tabellen :P

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
LuCarD schreef op 22 augustus 2002 @ 15:44:
[...]


Is "group by" niet beter?


Niet noodzakelijk volgens mij.

DISTINCT haalt alle niet - unieke rijen uit de resultset

GROUP BY gaat gaan groeperen, en wordt gebruikt bij aggregate functions.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Verwijderd schreef op 22 augustus 2002 @ 15:49:
[...]
in 9 verschillende tabellen :P



Oh nee, ik heb dan zo'n vaag vermoeden dat er iets serieus mis is met uw datamodel.
Lees hier eens iets over normalizeren.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 22 augustus 2002 @ 15:51:

[...]



Oh nee, ik heb dan zo'n vaag vermoeden dat er iets serieus mis is met uw datamodel.
Lees hier eens iets over normalizeren.
Nee kijk ik heb 9 verschillende catogorien waar gereplied kan worden. 9 afdelenen. elke afdeling heeft een eigen tabele waar unieke ID's en titels worden opgeslagen. Lijkt me niets mis mee. ik heb 1 tabel voor alle reacties... het werk perfect en heel snel. Alleen nu wil ik dus de laatste 9 titels hebben bij de laatste 9 reacties. Als die titels dus opgehaald moeten worden moet die data uit verschillende tabellen komen. Niet anders mogelijk toch :S

  • a3konijn
  • Registratie: Oktober 2000
  • Laatst online: 26-08 19:21
LuCarD schreef op 22 augustus 2002 @ 15:44:
[...]

oneee:
Misschien een los staande tip, dit heeft nix te maken met jouw huidige probleem.
Maar kijk eens bij
http://nl.php.net/switch
of
http://nl.php.net/manual/nl/control-structures.elseif.php


Lees dit ook eens door... http://gerard.yoursite.nl/got/php-tiplist
LOL. ;) Wordt niet op gereageerd, maar ondertussen heeft hij niet door dat met al die if-jes de php-script uitvoering onnodig lang duurt en dat hij onnodig veel copy-pasta heeft gedaan! Bovendien kan je zo hele rare fouten krijgen!

Voor de duidelijkheid: er wordt nu bij iedere if gekeken of er aan de voorwaarden wordt voldaan. Handiger is om zodra de goede gevonden is gewoon uit de controle structuur te springen.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
9 tabellen?
Dat maakt het er inderdaad niet eenvoudiger op. Dan moet je ipv de titel het veld nieuws_id gebruiken voor je distinct. Vervolgens per record dat je terug krijgt de titel opzoeken.
Verwijderd schreef op 22 augustus 2002 @ 15:55:
[...]
Nee kijk ik heb 9 verschillende catogorien waar gereplied kan worden. 9 afdelenen. elke afdeling heeft een eigen tabele waar unieke ID's en titels worden opgeslagen. Lijkt me niets mis mee. ik heb 1 tabel voor alle reacties... het werk perfect en heel snel. Alleen nu wil ik dus de laatste 9 titels hebben bij de laatste 9 reacties. Als die titels dus opgehaald moeten worden moet die data uit verschillende tabellen komen. Niet anders mogelijk toch :S
Dat zou maar zo kunnen van wel! Is het niet mogelijk om ipv de verschillende afdelingen in verschillende tabellen te stoppen, een afdeling_id op te nemen?

Never underestimate the power of


Verwijderd

Topicstarter
Is het niet gewoon mogelijk om in 1 query met joins de data uit al die tabellen te halen? of is dat extreem dom?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik weet niet precies hoe dat in MySQL zit, maar in MSSQL kan dat zeker.
Je moet dan LEFT JOIN's gebruiken en in de SELECT, afhankelijk van de cato de titel uit de juiste tabel pakken.

Maar ik ben toch wel erg benieuwd waarom je 9 aparte tabellen hebt gebruikt en het niet in 1 tabel heb gezet, waarin vervolgens een afdeling_id zit?

Never underestimate the power of


Verwijderd

Topicstarter
Crazy_D schreef op 22 augustus 2002 @ 17:18:
[...]

:? Dus ?
Al is het de koningin incognito, zulke smileys zijn niet echt liev. Als je problemen hebt met tweakzone los je dat maar ergens anders op, en als het een grapje is zou een lieve smiley niet misstaan.
dankje wel...

Ik heb ondertussen het titel problem opgelost.. nu is alleen het sorteer probleem er nog. Code is wat extreem complex ik weet het, maar het werkt :P

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?
 include "dbconfig.php";
 mysql_connect($dbhost, $dbuser, $dbpassword);
 $query = "SELECT * FROM reacties ORDER BY date DESC LIMIT 0, 9";
 $result = mysql_db_query($dbname, $query);

 if ($result)
{

    while ($r = mysql_fetch_array($result))
        {
            $id = $r["id"];
            $date = date ("H:i", $r['date']);
            $cato = $r["cato"];
            $nieuws_id = $r["nieuws_id"];

if($cato == "1") {
$link = "tweaks.php?page=bekijk&id=$nieuws_id";
$tabelnaam = "tweaks";
$aaa = "id";
$bbb = "titel"; 
}
if($cato == "2") {
$link = "downloads.php?page=bekijk&id=$nieuws_id";
$tabelnaam = "downloads";
$aaa = "id";
$bbb = "title"; 
}
if($cato == "3") {
$link = "reviews.php?page=bekijk&sub=tutorial&art_id=$nieuws_id&id=1";
$tabelnaam = "review";
$aaa = "id";
$bbb = "title";
}
if($cato == "4") {
$link = "tutorials.php?page=bekijk&sub=tutorial&art_id=$nieuws_id&id=1";
$tabelnaam = "tutorial";
$aaa = "id";
$bbb = "title";
}
if($cato == "5") {
$link = "nieuws.php?page=bekijk&id=$nieuws_id";
$tabelnaam = "articles";
$aaa = "id";
$bbb = "title"; 
}
if($cato == "6") {
$link = "casemods.php?page=bekijk&id=$nieuws_id";
$tabelnaam = "casemods";
$aaa = "id";
$bbb = "titel";
}
if($cato == "7") {
$link = "poll.php?id=$nieuws_id";
$tabelnaam = "poll_index";
$aaa = "poll_id";
$bbb = "question";
}
if($cato == "8") {
$link = "extra.php?page=crew&id=$nieuws_id";
$tabelnaam = "crew";
$aaa = "id";
$bbb = "naam";
}
if($cato == "9") {
$link = "scripts.php?page=bekijk&id=$nieuws_id";
$tabelnaam = "scripts";
$aaa = "id";
$bbb = "titel";
}
 $query2 = "SELECT $aaa,$bbb FROM $tabelnaam WHERE id = '$nieuws_id'";
 $result2 = mysql_db_query($dbname, $query2);

 if ($result2)
{

    while ($r = mysql_fetch_array($result2))
        {
            $titel = $r["$bbb"];


            echo "$date <a href=\"$link\">$titel</a><br>";
        }
}
}
}
?>


Ik dacht zelf om
$query = "SELECT * FROM reacties GROUP BY nieuws_id ORDER BY date DESC LIMIT 0, 9";
te doen maar dat werkt niet goed. De tijden en topics kloppen dan niet meer...

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

SELECT * FROM reacties GROUP BY nieuws_id ORDER BY date DESC LIMIT 0, 9

code:
1
2
3
4
5
6
7
8
9
10
11
12
select 
  max(date) as mDate,
  id,
  cato,
  nieuws_id
from
  reacties
group by 
  nieuws_id
order by 
  mDate desc
limit 0,9


try this...

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
LuCarD schreef op 22 augustus 2002 @ 17:36:
SELECT * FROM reacties GROUP BY nieuws_id ORDER BY date DESC LIMIT 0, 9

code:
1
2
3
4
5
6
7
8
9
10
11
12
select 
  max(date) as mDate,
  id,
  cato,
  nieuws_id
from
  reacties
group by 
  nieuws_id
order by 
  mDate desc
limit 0,9


try this...
Ik heb het geprobeerd en het klopt dan helemaal niet meer. Datum output is overal 0,00 en hij haald allemaal dingen op die er echt niet horen.

Verwijderd

Topicstarter
Niemand? Ik heb er nog eens goed naar gekeken maar logisch gezien moet het gewoon werken.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Hoi,
Welkom in P&W (FAQ-13/7/2002)
Policy mbt het omhoogschoppen van threads. Wacht minstens 24 uur voor je je topic omhoog schopt. Doe dit dan ook alleen met een zinnige opmerking en dus niet met "Waarom antwoord er nou niemand" nadat je 5 minuten geen antwoord hebt gehad. Sommigen van ons hebben een leven :+

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
Ok ik zit dus met een query waar ik dus niet uit kom. Het is de bedoeling om de laatste 9 berichten uit de DB op te halen. ID is uniek, nieuws_id niet, maar nieuws_id in combinatie met cato wel. nieuws_id is het id waar hij heen moet linken, en dmv cato nr weet hij de titel uit de juiste tabel te halen en de juiste link te maken. Dat is allemaal al geregeld. Nu is het probleem dat ik niet wil dat een bericht 2x voorkomt in de laatste 9 replies.

Met deze query kloppen alle tijden titels en links goed:
$query = "SELECT id,date,cato,nieuws_id FROM reacties ORDER BY id DESC LIMIT 0, 9";
Probleem is dan dus dat ik als er 2x achter elkaar gereplied is op het zelfde bericht dat er bovenaan 2x die titel verschijnd.

Nu heb ik de volgende querie al geprobeerd maar dan komt er een output waar niets van klopt:
$query = "SELECT id,date,cato,nieuws_id FROM reacties GROUP BY nieuws_id ORDER BY date DESC LIMIT 0, 9";

Wat doe ik fout?

Tabel waar info uit moet komen is als volgd:
code:
1
2
3
4
5
6
7
8
9
10
CREATE TABLE reacties ( 
  id int(11) NOT NULL auto_increment, 
  nieuws_id int(11) NOT NULL default '0', 
  cato int(11) NOT NULL default '0', 
  naam varchar(50) NOT NULL default '', 
  bericht text NOT NULL, 
  date int(12) NOT NULL default '0', 
  ip varchar(20) NOT NULL default '0', 
  PRIMARY KEY  (id) 
) TYPE=MyISAM;

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Aangezien ID een uniek veld is, zul je op die manier altijd dubbele waarden krijgen. Er bestaan nl. geen unieke rijen als je ID mee in uw SELECT clause zet.
Doe eens:
code:
1
2
3
4
SELECT date,cato,nieuws_id 
FROM reacties 
GROUP BY nieuws_id 
ORDER BY date DESC LIMIT 0, 9

https://fgheysels.github.io/


Verwijderd

Topicstarter
Nee werkt niet goed, bij replie komt topic niet weer bovenaan :(
http://www.tweakzone.nl/lr.php dat is de goede volgorde maar dan komen dingen dubbel
http://www.tweakzone.nl/lr2.php is jou laatste query maar dan klopt de volgorde niet...

Verwijderd

Topicstarter
Wat er dus fout gaat bij lr2.php dat hij de tijd pakt van de 1ste replie bij een bericht ipv de laatste.

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Waarom is date bij jouw een int veld?

Programmer - an organism that turns coffee into software.


Verwijderd

Topicstarter
LuCarD schreef op 23 augustus 2002 @ 13:35:
Waarom is date bij jouw een int veld?
Omdat ik geleerd heb dat een timestamp daarin moet...is dat fout dan?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Volgende poging (voor jou dan ;) ):

SELECT MAX (date),cato,nieuws_id
FROM reacties
GROUP BY nieuws_id, cato
ORDER BY MAX (date) DESC
LIMIT 0, 9

Never underestimate the power of


Verwijderd

Topicstarter
Zelfde probleem krijg ik daar, hij pakt de tijd van 1ste replie in een topic ipv laatste waardoor hij dus niet geupdate wordt.

Verwijderd

Topicstarter
Opzich zou het met distinct moeten kunnen maar als ik DISTINCT erin zet maakt het totaal geen verschil...

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Nee, het kan niet met DISTINCT, want je moet de nieuwste datum hebben PER nieuws_id. Daar is DISTINCT niet voor bedoeld.

Ik vind het trouwens vreemd dat mijn query van 13:52 niet werkt. Ik heb het ook even op MSSQL geprobeerd en daar werkt ie uitstekend. Op de LIMIT na dan, want dat bestaat daar niet.

Kun je anders het exacte resultaat wat je bij deze query terugkrijgt hier eens posten. Misschien dat ik het dan zie.

Never underestimate the power of


Verwijderd

Topicstarter
http://www.tweakzone.nl/lr2.php
daar kun je zien wat er gebeurt met
SELECT MAX (date),cato,nieuws_id
FROM reacties
GROUP BY nieuws_id, cato
ORDER BY MAX (date) DESC
LIMIT 0, 9

Als je eens een van de links bekijkt zie je dat als er 2 replies of meer gepost zijn dat hij de tijd van de eerste replie pakt :S

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Er blijven nog drie mogelijkheden over, denk ik:

1. De timestamp levert toch wel de nodige problemen op. Misschien dat je dan eens MIN ipv MAX moet proberen.
2. MySQL doet niet wat ie moet doen.
3. Je doet ergens anders in je code toch stiekem nog iets fout, maar die kans lijkt me het kleinst.

Never underestimate the power of

Pagina: 1