+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: mysql Ausgabe einschränken von A bis irgendwas...

  1. #1
    TP-Member Rosenbär macht alles soweit korrekt Avatar von Rosenbär
    Registriert seit
    Mar 2003
    Beiträge
    87

    mysql Ausgabe einschränken von A bis irgendwas...

    Hallo,
    habe grad nichts gefunden bzw weiss nicht, wie ich danach suchen soll, aber ich möchte gerne meine mysql Abfrage einschränken, indem ich bei der Ausgabe nur die Einträge mit Namen beginnend mit A bis F aufgelistet werden und dann von G bis M usw...

    Ich nehme jetzt mal an, dass ich dafür jedesmal (also 4x) eine eigene Abfrage benötige.
    So sollte es dann aussehen:

    A - F
    A1
    A2
    C1
    E1
    F1

    G - M
    G1
    I1
    J1
    J2
    M1

    M - R
    S - Z

    Also:
    SELECT * FROM auswahl WHERE titel LIKE 'a%' oder wie oder was...?

  2. #2
    TP-Special Mod steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    das würde ich nicht mit MySQL machen sondern nach Nanem sortieren und die Header (A-F etc.) in der Schleife schreiben.
    Tipp:
    PHP-Code:
    $oldAsc=0;
    while(...) {
    $firstLetter=ord(strtoupper(substr($row['name'],0,1)));
    if(
    $oldAsc==0) { 
       echo 
    '<p>A-F</p>';
       
    $oldAsc=70#ist das F
    }
    if(
    $firstLetter>$oldAsc) {
       echo 
    '<p>G-M</p>';
       
    $oldAsc=77#ist das M
    }
    ...


    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer


  3. #3
    TP-Member Rosenbär macht alles soweit korrekt Avatar von Rosenbär
    Registriert seit
    Mar 2003
    Beiträge
    87
    also ich habe jetzt die DB nach "titel" sortiert ausgelesen (ORDER BY title).
    Dann habe ich folgendes geschrieben:
    PHP-Code:
    $oldAsc    0;
    while(
    $filme mysql_fetch_assoc($db)) {
    $firstLetter ord(strtoupper(substr($filme['titel'],0,1)));
    if(
    $oldAsc == 0){
            echo 
    '<p>A - F</p>';
            
    $oldAsc    70// ist das "F"
        
    }
        if(
    $firstLetter    $oldAsc){
            echo 
    '<p>G - L</p>';
            
    $oldAsc    76// ist das "L"
        
    }
        if(
    $firstLetter    $oldAsc){
            echo 
    '<p>M - R</p>';
            
    $oldAsc    82// ist das "R"
        
    }
        if(
    $firstLetter    $oldAsc){
            echo 
    '<p>S - Z</p>';
            
    $oldAsc    90// ist das "Z"
        

    und ausgegeben wird:
    HTML-Code:
    A - F
    G - L
    M - R
    G - L
    M - R
    S - Z
    erstens und zweitens, wie bringe ich dann noch die ausgelesenen Filmtitel in an die richtigen Orte...?

  4. #4
    TP-Special Mod steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    unter den ifs müssen nur die Daten ausgegeben werden:

    echo $filme['titel'];


    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer


  5. #5
    TP-Member Rosenbär macht alles soweit korrekt Avatar von Rosenbär
    Registriert seit
    Mar 2003
    Beiträge
    87
    etwas funktioniert, leider ist dies nicht perfekt...
    dies ist der CODE:
    PHP-Code:
    $oldAsc    0;
    while(
    $filme mysql_fetch_assoc($db)) {
    $firstLetter    ord(strtoupper(substr($filme['titel'],0,1)));
        if(
    $oldAsc    == 0){
            echo 
    '<p>A - F</p>';
            echo 
    "<a href=\"index.php?section=filme&filmid=".$filme['id']."\">".$filme['titel']."</a>";
            
    $oldAsc    70// ist das "F"
        
    }
        if(
    $firstLetter    $oldAsc){
            echo 
    '<p>G - L</p>';
            echo 
    "<a href=\"index.php?section=filme&filmid=".$filme['id']."\">".$filme['titel']."</a>";
            
    $oldAsc    76// ist das "L"
        
    }
        if(
    $firstLetter    $oldAsc){
            echo 
    '<p>M - R</p>';
            echo 
    "<a href=\"index.php?section=filme&filmid=".$filme['id']."\">".$filme['titel']."</a>";
            
    $oldAsc    82// ist das "R"
        
    }
        if(
    $firstLetter    $oldAsc){
            echo 
    '<p>S - Z</p>';
            echo 
    "<a href=\"index.php?section=filme&filmid=".$filme['id']."\">".$filme['titel']."</a>";
            
    $oldAsc    90// ist das "Z"
        

    und das ist das Ergebnis:
    HTML-Code:
    A - F
    Brazil
    
    G - L
    Nackte Kanone, Die
    
    M - R
    Nackte Kanone, Die
    
    G - L
    Total Recall
    
    M - R
    Total Recall
    
    S - Z
    Total Recall
    G - L und M - R kommen zweimal vor und zwei Titel sind ebenfalls mehrfach vertreten. Mein PHP-Wissen ist leider noch weit von deinem entfernt St@eff.en, ich hoffe jedoch, dass du mir noch die Lösung nenne kannst bzw mir zeigst, wo ich falsch liege...

    Zudem werden nur drei der 8 eingetragenen Filme angezeigt, es fehlen zum Beispiel "Evil Dead" und "Full Metal Jacket"...
    Geändert von Rosenbär (02.03.2007 um 01:51 Uhr)

  6. #6
    TP-Senior Angelmaker ist auf einem guten Weg
    Registriert seit
    Jul 2006
    Ort
    Köln
    Beiträge
    247
    Benutze statt der IFs mal IF und else if.

    Für jede Zeiole aus der DB darf immer nur eine Kondition wahr sein.

    Wenn also dein ORD()_Wert einmal bereits größer war, als in der Kondition angegeeben, darf es NICHT nbocheinmal größer sein, als er ORD()-Wert.

    Mit dem Else if verhinderst Du das effektiv, da bei einem Else die IF kondition nur dann ausgewertet wird, wenn die vorherige if kondition false war.

    Hoffe, das war verständlich und ich hoffe, es löst das Problem. Testen und berichten.

    Ciao.
    Ich habe keine Signatur. Dieser Satz kein Verb.

  7. #7
    TP-Senior Angelmaker ist auf einem guten Weg
    Registriert seit
    Jul 2006
    Ort
    Köln
    Beiträge
    247
    Ach so - eine Lösung in SQL ( habs mit Oracle getestet ) sähe etwa so aus:

    SELECT FILM_NAME FROM DATENBANK WHERE substr(FILM_NAME,0,1) between 'A' AND 'E'
    optional: order by FILM_NAME DESC/ASC

    Die Zeile würde den FILMNAMEN aller FIlme ausgeben, deren erster Bucgstabe ( funktion substring ) ZWISCHEN A und E liegt.

    Cheers.

    edit: Falls Filmnamen aml groß und aml klein sind, hilft die FUnktion "UPPER" .

    Keine Ahnung ob MySQL das kann, sorry.
    Geändert von Angelmaker (02.03.2007 um 11:15 Uhr)
    Ich habe keine Signatur. Dieser Satz kein Verb.

  8. #8
    TP-Senior Angelmaker ist auf einem guten Weg
    Registriert seit
    Jul 2006
    Ort
    Köln
    Beiträge
    247
    Ach so - ein paar der FIlme tauchen wahrscheinlich nicht auf, weil, wenn eine neue Zeile aus der WHile schleife geholt wird, die variable oldasc nicht zurückgesetzt wird. Der Wert für den Anfangsdbuchstaben für den FIlm ist dann aber kleiner als die variable oldasc und taucht daher nicht mehr auf. Du müßtest also auf jeden Fall die Filme aus der Datebank in einer FOlge selektieren, die verhindert, daß Z vor A reinkommen, sonst wird der Wert für oldasc zu hoch und der FIlm taucht nicht mehr auf.

    BSP:
    Wen evil dead nach full metal selektiert wird, steht $oldasc bereits auf F oder höher. E !> F daher kaputtnik.
    Ich habe keine Signatur. Dieser Satz kein Verb.

  9. #9
    TP-Member Rosenbär macht alles soweit korrekt Avatar von Rosenbär
    Registriert seit
    Mar 2003
    Beiträge
    87
    Zitat Zitat von Angelmaker
    Ach so - eine Lösung in SQL ( habs mit Oracle getestet ) sähe etwa so aus:

    SELECT FILM_NAME FROM DATENBANK WHERE substr(FILM_NAME,0,1) between 'A' AND 'E'
    optional: order by FILM_NAME DESC/ASC

    Die Zeile würde den FILMNAMEN aller FIlme ausgeben, deren erster Bucgstabe ( funktion substring ) ZWISCHEN A und E liegt.

    Cheers.

    edit: Falls Filmnamen aml groß und aml klein sind, hilft die FUnktion "UPPER" .

    Keine Ahnung ob MySQL das kann, sorry.
    hat bei mir mit mysql nicht geklappt...
    Ach so - ein paar der FIlme tauchen wahrscheinlich nicht auf, weil, wenn eine neue Zeile aus der WHile schleife geholt wird, die variable oldasc nicht zurückgesetzt wird. Der Wert für den Anfangsdbuchstaben für den FIlm ist dann aber kleiner als die variable oldasc und taucht daher nicht mehr auf. Du müßtest also auf jeden Fall die Filme aus der Datebank in einer FOlge selektieren, die verhindert, daß Z vor A reinkommen, sonst wird der Wert für oldasc zu hoch und der FIlm taucht nicht mehr auf.

    BSP:
    Wen evil dead nach full metal selektiert wird, steht $oldasc bereits auf F oder höher. E !> F daher kaputtnik.
    also ich lese die Dateien geordnet nach Titel aus (ORDER BY titel), oder meinst du was anderes...?
    Benutze statt der IFs mal IF und else if.

    Für jede Zeiole aus der DB darf immer nur eine Kondition wahr sein.

    Wenn also dein ORD()_Wert einmal bereits größer war, als in der Kondition angegeeben, darf es NICHT nbocheinmal größer sein, als er ORD()-Wert.

    Mit dem Else if verhinderst Du das effektiv, da bei einem Else die IF kondition nur dann ausgewertet wird, wenn die vorherige if kondition false war.

    Hoffe, das war verständlich und ich hoffe, es löst das Problem. Testen und berichten.

    Ciao.
    Uff, ähm ja, aber was schreibe ich dann in die elseif-Schleife...?
    Wenn ich ein if($firstLetter > $oldAsc), was schreibe ich dann in die elseif(XXX) rein...?

  10. #10
    TP-Special Mod steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    PHP-Code:
    oldAsc    0;
    while(
    $filme mysql_fetch_assoc($db)) {
    $firstLetter    ord(strtoupper(substr($filme['titel'],0,1)));
        if(
    $oldAsc    == 0){
            echo 
    '<p>A - F</p>';
            
    $oldAsc    70// ist das "F"
        
    }
        elseif(
    $firstLetter    70){
            echo 
    '<p>G - L</p>';
            
    $oldAsc    76// ist das "L"
        
    }
        elseif(
    $firstLetter    76){
            echo 
    '<p>M - R</p>';
            
    $oldAsc    82// ist das "R"
        
    }
        elseif(
    $firstLetter    82){
            echo 
    '<p>S - Z</p>';
            
    $oldAsc    90// ist das "Z"
        
    }  
    //daten ausgeben
    echo "<a href=\"index.php?section=filme&filmid=".$filme['id']."\">".$filme['titel']."</a>";
            

    Geändert von steffenk (02.03.2007 um 13:24 Uhr)


    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer


  11. #11
    TP-Member Rosenbär macht alles soweit korrekt Avatar von Rosenbär
    Registriert seit
    Mar 2003
    Beiträge
    87
    Besten Dank an alle für die Hilfe. Selber hätte ich das lange nicht geschaft. Jetzt habe ich nur noch ein kleines Problem, es zeigt nämlich die Filme richtig an, aber die Überschriften sind falsch:

    A - F
    Brazil
    Dinner für Spinner
    Evil Dead
    Full Metal Jacket

    G - L
    Nackte Kanone, Die

    G - L
    Planet der Affen

    G - L
    Rambo

    G - L
    Total Recall

    schon komisch, die Filme sind richtig, aber die Überschriften werden anders übernommen bei St@eff.ens letztem Posting...
    Hei, wenn ich PHP doch nur selber besser verstehen würde...

  12. #12
    TP-Senior Angelmaker ist auf einem guten Weg
    Registriert seit
    Jul 2006
    Ort
    Köln
    Beiträge
    247
    Die Programmier logik ist falsch.

    Wenn 71 größer als 70 ist, dann ist auch 72 größer als 70. Und damit wird IMMER dfie zweite IF abfrage wahr und der rest fällt raus.

    Du mußt die Ausgabereihenfolge umdrehen.

    Sorry, ich check grad auch den Original code nicht so ganz... Eigentlich dürfte nur ein Film unter A-F ausgegeben werden, weil sofort im ersten durchlauf oldasc auf 70 gesetzt wird und damit A-F für die anderen Ergebniszeilen nicht mehr auftreten kann?

    Sorry, muß weg - kann montag weiterhelfen. Ciao und Sschlönes Wochenende.
    Geändert von Angelmaker (02.03.2007 um 16:30 Uhr)
    Ich habe keine Signatur. Dieser Satz kein Verb.

  13. #13
    TP-Special Mod steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    es war noch nicht ganz korrekt, das kommt davon, wenn man auf die Schnelle trocken reinschreibt.

    Hier die korrigierte Fassung:
    PHP-Code:
    $oldAsc 0;
    while(
    $filme mysql_fetch_assoc($db)) {
        
    $firstLetter ord(strtoupper(substr($filme['titel'],0,1)));
        if(
    $oldAsc    == 0){
            echo 
    '<p>A - F</p>';
            
    $oldAsc    70// ist das "F"
        
    }
        elseif(
    $firstLetter 70 && $oldAsc==70){
            echo 
    '<p>G - L</p>';
            
    $oldAsc    76// ist das "L"
        
    }
        elseif(
    $firstLetter    76 && $oldAsc==76){
            echo 
    '<p>M - R</p>';
            
    $oldAsc    82// ist das "R"
        
    }
        elseif(
    $firstLetter    82 && $oldAsc==82){
            echo 
    '<p>S - Z</p>';
            
    $oldAsc    90// ist das "Z"
        
    }  
    //daten ausgeben
    echo "<a href=\"index.php?section=filme&filmid=".$filme['id']."\">".$filme['titel']."</a>";
            

    Es wird immer geschaut, ob der erste Buchstabe grösser ist - wenn ja, dann gibt er die Überschrift aus. Damit das nur einmal passiert, wird die Hilfsvar $oldAsc gesetzt.


    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer


  14. #14
    TP-Member Rosenbär macht alles soweit korrekt Avatar von Rosenbär
    Registriert seit
    Mar 2003
    Beiträge
    87
    Woohoo, besten Dank, das funktionert nun perfekt. Vielen Danke an alle hier im Thread...

  15. #15
    TP-Member Rosenbär macht alles soweit korrekt Avatar von Rosenbär
    Registriert seit
    Mar 2003
    Beiträge
    87
    noch eine kleine Frage habe ich. Wie gebe ich zum Beispiel nur die Filmtitel von A bis M aus...?
    Die obige Methode gibt ja immer alles aus...

+ Antworten
Seite 1 von 2 1 2 LetzteLetzte

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

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