[PHP] SELECT samen met LIMIT en conditie

Pagina: 1
Acties:
  • 347 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DriesA
  • Registratie: December 2003
  • Laatst online: 14-09 09:49
Hoi,

Ik probeer een aantal resultaten (activiteiten) uit een SQL database te halen. Deze resultaten moeten aan de volgende voorwaarden voldoen:
1) de activiteiten moeten vervallen zijn (zie regel 6 van de code)
2) de oudste moeten bovenaan staan (zie regel 1 van de code)
3) er mogen maximaal drie resultaten getoond worden (zie regel 1 van de code)

Met deze laatste zit ik vast. Ik weet dat je hiervoor het LIMIT-commando kan gebruiken. Maar als ik deze toevoeg, verschijnen er geen resultaten.

Ik denk dat dit komt omdat er eerst maximaal drie resultaten worden opgehaald (voorwaarde 3), en vervolgens gechecked wordt op de conditie dat de activiteiten vervallen moeten zijn (voorwaarde 1).

Weten jullie waar ik mijn LIMIT-commando best plaats? Ik zit echt vast...

Bedankt!

code:
1
2
3
4
5
6
7
8
9
10
11
$query  = "SELECT * FROM activiteiten ORDER BY date DESC, startTime DESC LIMIT 3" ;
$result = mysql_query($query);

while($row = mysql_fetch_assoc($result))
{
    if ($row['date'] <= date('Y-m-d'))
    {
activiteiten_admin($row);
displayActions($row);
    }
}

I don't have hard drives. i just keep 30 chinese teenagers in my basement and force them to memorize numbers.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Zoek in de (my)sql handleiding eens naar wat je met de WHERE clausule in je query kunt doen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • mace
  • Registratie: Juni 2003
  • Laatst online: 20-09 15:25

mace

Sapere Aude

Je selecteert in je query de eerste 3 activiteiten, ongeacht of ze vervallen zijn of niet.
Vervolgens zullen ze alle drie niet voldoen aan voorwaarde 1.

Voorwaarde 1 kan je het beste checken in je SQL query, en niet in php.
SQL heeft hier zat mogelijkheden voor.

Dan zal het wel goed gaan denk ik. :)

edit: met hem ^^ ;)

[ Voor 3% gewijzigd door mace op 02-11-2007 15:34 ]


Acties:
  • 0 Henk 'm!

  • Low-Tech
  • Registratie: December 2001
  • Laatst online: 00:38
code:
1
2
3
4
5
6
7
$query  = "SELECT * FROM activiteiten WHERE date <= ".date('Y-m-d')." ORDER BY date DESC, startTime DESC LIMIT 3";
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result))
{
   activiteiten_admin($row);
   displayActions($row);
}


Volgens mij moet het dan zo.

Fractal Design Meshify S2, Asus ROG B550-F, AMD 3700x, 3080?, Corsair H115i Pro, G-Skill 3600-16 32GB Trident Z Neo


Acties:
  • 0 Henk 'm!

  • Ascathon
  • Registratie: Augustus 2004
  • Laatst online: 17-09 19:36
Zover ik weet eist LIMIT 2 variabelen. Eerste het startrecord en tweede de lengte.

SELECT * FROM `your_table` LIMIT 0,3

Laat 1 tm 3 zien. Het eerste record is 0. Dus record 2 qua SQL is nummer 3 in de tabel.

[ Voor 22% gewijzigd door Ascathon op 02-11-2007 15:44 . Reden: Aangepast aan TS' situatie ]


Acties:
  • 0 Henk 'm!

  • Low-Tech
  • Registratie: December 2001
  • Laatst online: 00:38
Ascathon schreef op vrijdag 02 november 2007 @ 15:40:
Zover ik weet eist LIMIT 2 variabelen. Eerste het startrecord en tweede de lengte.

SELECT * FROM `your_table` LIMIT 5, 5

Laat 6 tm 10 zien. Het eerste record is 0. Dus record 5 qua SQL is nummer 6 in de tabel.
LIMIT kan gerust met 1 parameter, klik hier.
With one argument, the value specifies the number of rows to return from the beginning of the result
In other words, LIMIT row_count is equivalent to LIMIT 0, row_count.

Fractal Design Meshify S2, Asus ROG B550-F, AMD 3700x, 3080?, Corsair H115i Pro, G-Skill 3600-16 32GB Trident Z Neo


Acties:
  • 0 Henk 'm!

  • harp00n
  • Registratie: Oktober 2006
  • Laatst online: 18-09 17:48
de query is volgens mij wel goed..

volgens mij ligt het aan de if-statement die je maakt.. je vergelijkt de inhoud van een cel (de cel: date) met een variabele.. dit is normaal geen probleem.. maar je wil nu de celinhoud bijvoorbeeld 10-10-2005 vergelijken met een 11-11-2004.. kan dit wel? moet je dan niet eerst eentje omzetten naar een timestamp? dan pas kan je volgens mij data vergelijken?


mss kan het wel op die manier van jou, maar zo heb ik het nog nooit gezien/gebruikt..

Acties:
  • 0 Henk 'm!

  • DriesA
  • Registratie: December 2003
  • Laatst online: 14-09 09:49
Bedankt voor de snelle reacties.

Op aangeven van Nova heb ik het volgende geprobeerd.
Let op de "LIMIT 100". Gezien ik nog maar een 10-tal entries in mijn table heb, zou die LIMIT dus eigenlijk niets mogen uithalen. Toch resulteert deze query in nul resultaten.

Ook als ik de "LIMIT 100" weglaat, geeft hij geen resultaten? Nochtans deed hij dat wel met mijn originele query (topicstart).

code:
1
2
3
4
5
6
7
8
9
10
11
$query  = "SELECT * FROM activiteiten WHERE date <= ".date('Y-m-d')." ORDER BY date DESC, startTime DESC LIMIT 100";
$result = mysql_query($query);

while($row = mysql_fetch_assoc($result))
{
    if ($row['date'] <= date('Y-m-d'))
    {
activiteiten_admin($row);
displayActions($row);
    }
}

I don't have hard drives. i just keep 30 chinese teenagers in my basement and force them to memorize numbers.


Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
harp00n schreef op vrijdag 02 november 2007 @ 15:53:
de query is volgens mij wel goed..
Heb jij wel gelezen? En weet je misschien iets van programmeren?

Het mag toch overduidelijk zijn dat de antwoorden gegeven door de mensen hierboven het probleem oplossen en aangeven waar het probleem zit. Als hij er eerst timestamps van gaat maken houd hij hetzelfde probleem.

petersmit.eu


Acties:
  • 0 Henk 'm!

  • Low-Tech
  • Registratie: December 2001
  • Laatst online: 00:38
En toch heeft hij wel een punt. Is het veld date ook een echt DATE type?

Je kan anders ook de functies van MySQL zelf gebruiken in je query: klik hier

Fractal Design Meshify S2, Asus ROG B550-F, AMD 3700x, 3080?, Corsair H115i Pro, G-Skill 3600-16 32GB Trident Z Neo


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Die IF statement voert nu een string comparison uit..

De oplossing is in de eerste reply al gegeven overigens.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • DriesA
  • Registratie: December 2003
  • Laatst online: 14-09 09:49
"date" heeft inderdaad het DATE type.

I don't have hard drives. i just keep 30 chinese teenagers in my basement and force them to memorize numbers.


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Lees Waar hoort mijn topic? en kom erachter dat dit topic eigenlijk in Programming. Tikkie die kant op.

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

In je PHP code doe je nog eens een extra vergelijking. Weet je 100% zeker dat die goed gaat? Komen er wel resultaten uit de query? Oftewel: we verwachten dat je in eerste instantie zelf gaat debuggen en dat lijk je nu niet gedaan te hebben.

[ Voor 81% gewijzigd door Creepy op 02-11-2007 16:38 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 01:02
Kijk dan in de manual naar datumfuncties van MySQL en bouw zo een WHERE clausule waarin je de datum uit de tabel met de huidige datum vergelijkt, zoals je eerst dus in de if deed.

Acties:
  • 0 Henk 'm!

  • Low-Tech
  • Registratie: December 2001
  • Laatst online: 00:38
Even uit de losse pols:
PHP:
1
2
3
4
5
6
7
$query  = "SELECT * FROM activiteiten WHERE date <= CURDATE() ORDER BY date DESC, startTime DESC LIMIT 3";
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result))
{
   activiteiten_admin($row);
   displayActions($row);
}


De datetype is namelijk in de YYYY-MM-DD manier opgesteld, vandaar dat je php code niet werkt(e).
Enige gevaar in deze is dat de tijd/datum van de mysqlserver goed moet staan (indien je MySQL ergens anders gehost wordt dan je webserver).

[ Voor 15% gewijzigd door Low-Tech op 02-11-2007 17:17 ]

Fractal Design Meshify S2, Asus ROG B550-F, AMD 3700x, 3080?, Corsair H115i Pro, G-Skill 3600-16 32GB Trident Z Neo


Acties:
  • 0 Henk 'm!

  • DriesA
  • Registratie: December 2003
  • Laatst online: 14-09 09:49
Gevonden!

code:
1
SELECT  *  FROM activiteiten WHERE CURRENT_TIMESTAMP >= date ORDER  BY date DESC , startTime DESC  LIMIT 3


@Nova: Ik zie je oplossing nu ook. Ook bedankt!

[ Voor 15% gewijzigd door DriesA op 02-11-2007 17:24 ]

I don't have hard drives. i just keep 30 chinese teenagers in my basement and force them to memorize numbers.

Pagina: 1