Avatar billede hp-power Nybegynder
03. maj 2010 - 05:21 Der er 26 kommentarer og
1 løsning

php sql alfabetisk list

jeg har lavet et simplet kartotek over film.

database indeholder bare to felter ID & TITLE
og indeholder fx.
hunted
hackers
matrix
die hard

det jeg gerne vil have er en liste som

d  h m

så man kan klikke på det bogstav så det viser alle film der starter med det bogstad. kunne jo selvføldig bare lave det hele manuelt men. der er sikker en nemmer måde så man også kun for vist de bogstaver der film til..

håber i forstår mig..
Avatar billede claes57 Ekspert
03. maj 2010 - 08:28 #1
select * from tabel order by title
Avatar billede repox Seniormester
03. maj 2010 - 08:42 #2
Du kunne lave noget ala:

<?php  
  foreach(range('A','Z') as $i)
    echo "<a href=\"?letter=".$i."\">".$i."</a> ";

  $letter = "A";
  if( isset($_GET["letter"]) )
    $letter = mysql_real_escape_string($_GET["letter"]);

  $sql = "SELECT * FROM tabel WHERE SUBSTRING(felt, 1, 1) = '".$letter."'";
  $result = mysql_query($sql);

  ,,, blah blah blah...

?>
Avatar billede j4k0b Nybegynder
03. maj 2010 - 10:06 #3
SELECT * FROM tabel WHERE title LIKE 'A%'
Avatar billede repox Seniormester
03. maj 2010 - 10:13 #4
#3
Ressourceforbruget i dit forslag er større end i mit samtidig med at du mister fordelene ved indeksering.
Avatar billede showsource Seniormester
03. maj 2010 - 10:59 #5
For nu at komme med en løsning til spm.

$sql = "SELECT DISTINCT(LEFT(UPPER(titel), 1)) as bogstav FROM tabel ORDER BY bogstav ASC";

$rows = mysql_query($sql) or die (mysql_error());

$letters = array();

while($p = mysql_fetch_object($rows)) {

$letters[] = $p->bogstav;

echo " <a href=\"".$_SERVER["PHP_SELF"]."?show=".$p->bogstav."\">".$p->bogstav."</a>";

}

mysql_free_result($rows);


if(isset($_GET["show"]) && in_array($_GET["show"], $letters)) {

// hent og ´vis fra db

}
Avatar billede j4k0b Nybegynder
03. maj 2010 - 12:41 #6
repox nu er jeg ikke særlig bekendt med MySQL specifikt, men i dit forslag har du fat i hvert enkelt felt, behandler det og validerer derefter. Kan ikke se hvordan der er forskel i mit og dit forslag mht. indeksering?
Avatar billede repox Seniormester
03. maj 2010 - 12:58 #7
#6
".. men i dit forslag har du fat i hvert enkelt felt, behandler det og validerer derefter" - det bliver du nød til at uddybe, for det forstår jeg ingenting af.

Dit forslag lægger op til at bruge wildcard søgninger som ikke udnytter indeksering - altså, med andre ord får du ikke noget ud af at optimere din tabel.

Mit forslag korter det ønskede felts værdi ned til et tegn, men som stadig udnytter den effektive indeksering - faktisk er forslaget i #5 væsentligt mere driftsikkert og optimeret til at også hente de ønskede data ud, end det jeg selv foreslog.

Så forskellen i dit og mit forslag ligger i resourceforbruget samt udnyttelsen af de optimeringer man foretager sig, når man vil lave databaser som disse.
Avatar billede j4k0b Nybegynder
03. maj 2010 - 13:10 #8
Jeg mener at du har fat i samtlige rækker i tabellen, hiver første tegn ud af titlen og validerer derefter om tegnet er lig med $letter. Dermed skal du (for alle entries i hele tabellen) behandle titlen, hvilket...:

1) Kræver CPU - ligesom søgning med et wildcard som databasen laver om til et regulært udtryk

2) Gør at databasen ikke kan bruge indekseringen, da samtlige rækker i tabellen skal kaldes frem og valideres

Det går imod princippet i et indeks... Jeg vil mene at den eneste forskel på dit og mit forslag er at det der sker, sker "bag scenen" i mit forslag. gotz it? :-)
Avatar billede j4k0b Nybegynder
03. maj 2010 - 13:11 #9
Hvis man skal udnytte indeksering i dette tilfælge, skal der tilføjes et nyt felt på tabellen KUN indeholdende det første tegn i titlen. På den måde indeholder ordopslaget det præcise frase der skal søges på, og så kan indekset udnyttes
Avatar billede repox Seniormester
03. maj 2010 - 13:33 #10
"Jeg mener at du har fat i samtlige rækker i tabellen, hiver første tegn ud af titlen og validerer derefter om tegnet er lig med $letter. "
Det er forkert. Hvad skulle formålet være med indeksering, så?
Så ville indeksering jo heller ikke virke på arbitrære søgninger - hvilket gør at jeg bliver nød til at spørge igen - hvad er så formålet med indeksering?
Avatar billede j4k0b Nybegynder
03. maj 2010 - 14:00 #11
Min pointe er netop at hverken din eller min metode benytter indekseringen. Derfor...:

Hvis man skal udnytte indeksering i dette tilfælge, skal der tilføjes et nyt felt på tabellen KUN indeholdende det første tegn i titlen. På den måde indeholder ordopslaget det præcise frase der skal søges på, og så kan indekset udnyttes
Avatar billede repox Seniormester
03. maj 2010 - 14:06 #12
Din pointe må der være belæg for; hvorfor udnytter min min metode ikke indekseringen?
Avatar billede showsource Seniormester
03. maj 2010 - 18:31 #13
Skal vi ikke bare sige at mit forslag er ok ? :O))))))
Avatar billede showsource Seniormester
03. maj 2010 - 18:33 #14
while($p = mysql_fetch_object($rows)) {

$letters[$p->bogstav] = $p->bogstav;

echo " <a href=\"".$_SERVER["PHP_SELF"]."?show=".$p->bogstav."\">".$p->bogstav."</a>";

}

mysql_free_result($rows);


if(isset($letters[$_GET["show"]])) {

// hent og ´vis fra db

}

er vist lidt bedre.
Avatar billede repox Seniormester
03. maj 2010 - 18:35 #15
^^
Den er jeg med på!
Avatar billede arne_v Ekspert
03. maj 2010 - 20:08 #16
Hmmm.

Med gængse databaser og almindelige trae-baserede index, saa vil:

... WHERE fekt LIKE 'A%'

fint udnytte index paa felt.

(det er kun hash-baserede index som har problemer)

... WHERE felt LIKE '%A%'
... WHERE felt LIKE '%A'

kan naturligvis ikke bruge index, men det er jo saa ikke saa relevant her.
Avatar billede arne_v Ekspert
03. maj 2010 - 20:11 #17
Derimod er det noget mere tvivlsomt om:

... WHERE SUBSTRING(felt,1,1)='A'

vil udnytte index optimalt.

Maaske vil databasen opdage at naar det er foerste tegn, saa kan den lave det samm esom med LIKE.

Men hvis ikke den goer det saa vil den scanne hele indexet og teste alle indexerede vaerdier.
Avatar billede repox Seniormester
03. maj 2010 - 22:28 #18
#16
Vedrørende de hash-baserede index søgninger, fandt jeg noget der understøtter det du siger her: http://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html
Så der giver jeg mig, men havde da delvist ret.

Dog kan jeg ikke finde noget som understøtter det du siger i #17. Om indekseringen anvendes optimalt eller ej, kan jeg så desværre ikke sige. Men i forhold til førnævnte dokumentation (samt en del googlesøgninger) fandt jeg ikke noget som giver anledning til at - som udgangspunkt - der ikke anvendes indeksering (uanset effekten).
Avatar billede arne_v Ekspert
05. maj 2010 - 03:25 #19
Jeg er simpelthen skeptisk overfor om den kan gennemskue at SUBSTRING(felt,i,n) kan bruge et index på felt for i=1 men ikke for i!=1.
Avatar billede arne_v Ekspert
05. maj 2010 - 03:27 #20
MySQL 4.1:

mysql> EXPLAIN SELECT * FROM words WHERE w LIKE 'A%';
+----+-------------+-------+-------+---------------+------------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key        | key_len | ref  | rows | Extra      |
+----+-------------+-------+-------+---------------+------------+---------+------+------+-------------+
|  1 | SIMPLE      | words | range | words_w_ix    | words_w_ix |    256 | NULL | 1432 | Using where |
+----+-------------+-------+-------+---------------+------------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM words WHERE w LIKE '%A%';
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra      |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | words | ALL  | NULL          | NULL |    NULL | NULL | 30453 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM words WHERE SUBSTRING(w,1,1) = 'A';
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra      |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | words | ALL  | NULL          | NULL |    NULL | NULL | 30453 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM words WHERE SUBSTRING(w,2,1) = 'A';
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra      |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | words | ALL  | NULL          | NULL |    NULL | NULL | 30453 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)
Avatar billede arne_v Ekspert
05. maj 2010 - 03:32 #21
Jeg skal ikke udelukke at en nyere MySQL version kan gøre det bedre.
Avatar billede arne_v Ekspert
05. maj 2010 - 03:35 #22
Hvis du undrer dig over vendingen "udnytte index optimalt" så er det fordi at min forventning var:

LIKE 'A%'

lookup N i index
lookup N i data

LIKE '%A%'

lookup all i data

SUBSTRING(,1,1)='A'

lookup all i index
lookup N i data

SUBSTRING(,2,1)='A'

lookup all i data
Avatar billede hp-power Nybegynder
12. maj 2010 - 15:57 #23
så vil et svar jo være rart
Avatar billede arne_v Ekspert
12. maj 2010 - 16:27 #24
Så er det bare lige spørgsmålet om hvem.

Det her har jo været en "blandet gryderet".
Avatar billede hp-power Nybegynder
12. maj 2010 - 16:30 #25
så som jeg kunne se blev de  selv enig om det.
Avatar billede arne_v Ekspert
13. juni 2010 - 04:23 #26
diverse deltagere>

Det var vist en opfordring til at smide et svar !!
Avatar billede hp-power Nybegynder
17. september 2010 - 00:19 #27
ingen svar og jeg er træt af mail ang åbne spørgsmål. så jeg lukker selv
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester