[mysql/php] zoek functie per pagina

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig mijn search engine voor een bepaalde site te verbeteren oftewel wat meer search mogelijkheden in te bouwen.. waaronder

* zoeken op letters
* zoeken op catagorie
* zoeken op type
* zoeken min grote, max grote
* zoeken met image? etc

nu wil ik ook mijn engine uitbreiden om te werken met meerdere pagina's... dus als je zoekt op xxx dat er dan bv 10 pagina's uitkomen ;) opzich is dat natuurlijk niet zo moeilijk met MySQL haal je met een count het aantal gegevens uit de db en met de daarop volgende query lees je de items uit ($van, $maxaantalitems)

alleen zit ik nu met een probleem, de volgende query haalt uit de db items van dit
code:
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
count(*)  
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
4 
4 
4 
4 
4 
1 
1 
1 
1 
1 
1 
1

:{

de query is
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
SELECT
                         count(*)
                     FROM
                         sd_item
                     LEFT JOIN
                         sd_tree
                     ON
                         sd_tree.id = sd_item.tree_id
                     LEFT JOIN
                         sd_hash
                     ON
                         sd_hash.item_id = sd_item.id
                     WHERE
                         ( sd_item.title LIKE '%sex%' OR sd_hash.filename LIKE '%sex%')
                     AND
                         sd_item.tree_id > 0
                     GROUP BY
                         sd_item.id
                     ORDER BY
                         sd_item.id DESC
?>


Ik dacht dat ik deze oplossing reeds gevonden had (met hulp van Got->Zef;)

de GROUP BY moest ik verwijderen daarna gaf hij het aantal rijen... nu zit ik met een geheel ander probleem binnen deze zelfde search engine..

met deze query (die ik nu gefixt hebt) lees ik het aantal items uit,
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT 
    count(sd_item.id) 
FROM 
    sd_item 
LEFT JOIN 
    sd_tree 
ON 
    sd_tree.id = sd_item.tree_id 
LEFT JOIN 
    sd_hash 
ON 
    sd_hash.item_id = sd_item.id 
WHERE 
    ( sd_item.title LIKE '%test%' OR sd_hash.filename LIKE '%test%') 
AND 
    sd_item.tree_id > 0 
ORDER BY 
    sd_item.id DESC

nu geeft dit dat er 30 items zijn terwijl de volgende query de items moet laden en maar 11 items aangeeft :{ dit is echt wel super vervelend.. nu heb ik de query nogmaals goed bekeken maar kan niet vinden waarom de ene 30 aan geeft terwijl de andere er maar 11 vind, of zal het dan toch aan de group by liggen en zo jah hoe kan ik dan de 1e query optimaliseren inclusief de group by
code:
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
SELECT 
    sd_item.id, 
    sd_item.cnt_views as views, 
    sd_item.title, sd_item.image, 
    sd_item.cnt_rating, 
    sd_item.cnt_votes, 
    sd_item.cnt_files as files, 
    sd_item.cnt_size as totalsize, 
    sd_item.cnt_clicks as dls, 
    sd_tree.id as treeid, 
    sd_tree.title as treetitle 
FROM 
    sd_item 
LEFT JOIN 
    sd_tree 
ON 
    sd_tree.id = sd_item.tree_id 
LEFT JOIN 
    sd_hash 
ON 
    sd_hash.item_id = sd_item.id 
WHERE 
    ( sd_item.title LIKE '%test%' OR sd_hash.filename LIKE '%test%') 
AND 
    sd_item.tree_id > 0 
GROUP BY 
    sd_item.id 
ORDER BY 
    sd_item.id 
DESC 
LIMIT 0, 25


maar blijkt dus niet zo te zijn...

wat wil ik!

1. een snelle search doen waarmee ik een count terug krijg met alle items uit mijn database zonder dat dit veel preformace vraagt
2. ik wil de database uitlezen van $from, 20 dus vanaf de geselecteerde pagina 20 items (ofzoites)

Nu las ik in een topic van iemand waarin ACM de laatste reactie gaf dat het ook mogelijk is om tempory tables te gebruiken, daarop heb ik echter gezocht maar niets gevonden waar ik precies duidelijk gemaakt kon worden hoe het werkt, wat ik er mee kan etc? nu is natuuriljk ook de vraag of dit handig is voor mijn website maar dat even terzijde.

Ik hoop dat deze topic wel openblijft want heb nu al 9 dagen op mijn probleem zitten spacen en heb er nog geen antwoord op :{

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Verwijderd schreef op 26 april 2003 @ 09:48:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT 
    count(sd_item.id) 
FROM 
    sd_item 
LEFT JOIN 
    sd_tree 
ON 
    sd_tree.id = sd_item.tree_id 
LEFT JOIN 
    sd_hash 
ON 
    sd_hash.item_id = sd_item.id 
WHERE 
    ( sd_item.title LIKE '%test%' OR sd_hash.filename LIKE '%test%') 
AND 
    sd_item.tree_id > 0 
ORDER BY 
    sd_item.id DESC
Waarom doe je hier een ORDER BY ?
Die query haalt slechts 1 row op, dus waarom ga je sorteren?
code:
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
SELECT 
    sd_item.id, 
    sd_item.cnt_views as views, 
    sd_item.title, sd_item.image, 
    sd_item.cnt_rating, 
    sd_item.cnt_votes, 
    sd_item.cnt_files as files, 
    sd_item.cnt_size as totalsize, 
    sd_item.cnt_clicks as dls, 
    sd_tree.id as treeid, 
    sd_tree.title as treetitle 
FROM 
    sd_item 
LEFT JOIN 
    sd_tree 
ON 
    sd_tree.id = sd_item.tree_id 
LEFT JOIN 
    sd_hash 
ON 
    sd_hash.item_id = sd_item.id 
WHERE 
    ( sd_item.title LIKE '%test%' OR sd_hash.filename LIKE '%test%') 
AND 
    sd_item.tree_id > 0 
GROUP BY 
    sd_item.id 
ORDER BY 
    sd_item.id 
DESC 
LIMIT 0, 25
Waarom doe je hier een GROUP BY?
Je gebruikt nergens aggregated functions in je select, dus een group by is hier helemaal niet nodig.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zal uitleggen waarom ik een group by gebruik.

wanneer ik geen group by gebruik kan ik data zoals dit

code:
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
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games

de 2e is met group by
code:
1
2
3
4
5
6
7
8
9
10
11
12
6580 4 test ./cache/images/6580.jpeg 0 0 13 1664263889 0 10 Porno 
6024 28 Worlds Greatest Coaster 3D   4 2 3 113719998 16 64 Games 
6006 27 Test Drive  Deviance   7 1 2 1189867392 14 64 Games 
4904 0 Magical Girl Pretty Sammy TV   03   Test, Test, Test!   0 0 1 98064384 0 125 Magical Girl Pretty Sammy 
3768 7 Test Yourself Network Plus Certification Exe   7 1 1 4382104 4 73 E-Books 
3752 2 A  Core Test Doc   0 0 1 168960 1 73 E-Books 
3750 5 A  Certification TestingEngine Exe   6 1 1 3097856 3 73 E-Books 
3714 1 Exam Essentials 5 1 Novell Tests Pck With Crack   0 0 1 11218680 0 73 E-Books 
2250 0  The Sweetest Thing   0 0 1 0 0 5 Movies 
785 22 Ultimate Fighting Championships Greatest Hits.avi   5 1 1 726775296 6 30 Action 
732 9 Sweetest Thing, The http://ia.imdb.com/media/imdb/01/I/79/13/70m.jpg 0 0 1 733249536 6 32 Comedy 
364 12 Greatest Places, The http://ia.imdb.com/media/imdb/01/I/46/70/31m.jpg 0


Zie je het verschil? :D natuurlijk is dit ook mogelijk met distinct maar ik deed het nu even op deze manier... :D

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Dan moet je geen group by gebruiken, maar een distinct.

Probeer jouw query (met die group by) maar eens uit op een ander (echt) RDBMS zoals Oracle of Sql Server oid....

En natuurlijk krijg je verschillende waardes terug.

In je eerste query ga je alle records gaan tellen (dus ook de dubbele).

Kan je niet doen:
code:
1
SELECT COUNT (distinct * ) ...

oid?

[ Voor 38% gewijzigd door whoami op 26-04-2003 11:19 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Kan je niet doen:
code:
1
SELECT COUNT (distinct * ) ...

oid?
Heb het net ff getest op een db, en dit werkt bij mij in ieder geval, dus zou het voor de TS ook moeten werken :)

[ Voor 3% gewijzigd door Verwijderd op 26-04-2003 11:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami, geweldig, ik heb het nu getest met

SELECT count(distinct sd_item.id)

en moet zeggen dat dat perfect werkt... ik was alleen dom in de veronderstelling dat distinct ook () nodig had :?

_O_ vriendelijk bedankt!
Pagina: 1