Ankündigung

Einklappen
Keine Ankündigung bisher.

Diverse Fragen zum Multi-Query

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Diverse Fragen zum Multi-Query

    Hallo,

    ich habe den folgenden Code:

    PHP-Code:
    <?php
        $queryCountStr  
    "SELECT COUNT(id) FROM " $dbpraefix "news; ";
        
    $queryCountStr .= "SELECT COUNT(id) FROM " $dbpraefix "users; ";
        
    $queryCountStr .= "SELECT COUNT(id) FROM " $dbpraefix "logs; ";
        
    $queryCountStr .= "SELECT COUNT(title) FROM " $dbpraefix "backup_news; ";
        
    $queryCountStr .= "SELECT * FROM " $dbpraefix "news ORDER BY date1 desc, time desc LIMIT 5; ";
        
        if(
    $con->multi_query($queryCountStr)) {
            
    $i 0;
            
            do {
                if(
    $result $con->store_result()) {
                    while(
    $row $result->fetch_assoc()) {
                        
    $res[] = $row;
                    }
                    if(
    $con -> more_results()) {
                        
    $i++;
                    }
                }
            } while(@
    mysqli_next_result($con));
            
        }
    ?>
    Zuerst einmal, was ich überhaupt erreichen möchte: Ich baue ein Dashboard für ein kleines Backend, dort sollen die 5 aktuellen News angezeigt werden. Zusätzlich sollen weitere Informationen angezeigt werden wie die Anzahl der existierenden News und die Anzahl der Benutzer.

    Frage 1:
    In den ersten vier Querys verwende ich COUNT(id), da ich nur die Anzahl der gefunden Ergebnisse erhalten möchte. Ist die Abfrage so schneller, als wenn ich COUNT weglassen würde? Ist sie außerdem schneller, wenn ich nur die ids zähle anstatt alle Spalten, also COUNT(*)?

    Frage 2:
    Mit dem dritten Query möchte ich die News ausgeben. Derzeitig ist $res ein eindimensionales Array, ich möchte aber bei meinem letzten Query ein zweispaltiges Array haben, sodass ich die News mit einer foreach-Schleife ausgeben kann. Im Moment ist es nämlich noch so, dass ich mit einer foreach-Schleife die Ergebnisse ALLER Querys ausgeben würde, und nicht nur die vom letzten.

    Zum besseren Verständnis mal das Array, das ich erhalte:

    PHP-Code:
    Array
    (
        [
    0] => Array
            (
                [
    COUNT(id)] => 10
            
    )

        [
    1] => Array
            (
                [
    COUNT(id)] => 3
            
    )

        [
    2] => Array
            (
                [
    COUNT(id)] => 6
            
    )

        [
    3] => Array
            (
                [
    COUNT(title)] => 4
            
    )

        [
    4] => Array
            (
                [
    id] => 10
                
    [author] => bla bla
                
    [title] => bla
                
    [subtitle] => bla
                
    [textTeaser] => bla
                
    [textFull] => bla
                
    [date1] => 2014-09-18
                
    [date2] => 
                [
    time] => 13:27:08
                
    [link] => 
                [
    imageText] => 
                [
    image] => 
            )

        [
    5] => Array
            (
                [
    id] => 7
                
    [author] => bla
                
    [title] => bla
                
    [subtitle] => 
                [
    textTeaser] => bla
                
    [textFull] => 
                [
    date1] => 2014-09-18
                
    [date2] => 
                [
    time] => 13:25:20
                
    [link] => 
                [
    imageText] => 
                [
    image] => 
            )

        [
    6] => Array
            (
                [
    id] => 8
                
    [author] => bla
                
    [title] => bla
                
    [subtitle] => 
                [
    textTeaser] => bla
                
    [textFull] => 
                [
    date1] => 2014-09-18
                
    [date2] => 
                [
    time] => 13:25:20
                
    [link] => 
                [
    imageText] => 
                [
    image] => 
            )


    Und ich weiß nicht, wie ich die News dynamisch ausgeben kann, ohne jetzt jede News einzeln anzusprechen ($res[4], $res[5], usw.)

    Ich hoffe ihr versteht das Problem und könnt mir helfen.

    Danke im Voraus!


  • #2
    Weiß nicht ob ich die Frage verstehe, aber versuche mal

    count(id) as news_counter
    count(id) as users_counter
    count(id) as logs_counter
    ....

    Und schau dir dann das array an

    Kommentar


    • #3
      Multi-SELECTs zwingen dich zum Result-Set-Lego. Was spricht dagegen das mit einzelnen Queries abzurufen ?
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar


      • #4
        @smilla:

        Danke aber das habe ich nicht gemeint.

        Ich möchte, dass ich für jede meiner Querys ein eigenes Array habe, was soweit auch passt, aber die News-Einträge von meinem letzten Query sollen sich zusammen in einem untergeordneten Array befinden, damit ich alle per foreach ausgeben kann. Oder gibt eine andere / bessere Möglichkeit, die News auszugeben?


        @tr0y:

        Ich habe öfters gelesen, dass Multy-Query schneller sind. Und auf meiner Seite werde ich Abfragen aus ca. 10 verschiedenen Tabellen haben. Dann macht das doch Sinn, oder??

        Kommentar


        • #5
          Ob du COUNT(*) oder COUNT(id) verwendest hat nur den Unterschied, dass du mit der Spaltenangabe nur Zeilen zählst, die in der gewünschten Spalte NON-NULL-Werte enthalten. Mit Count(*) werden die Anzahl vorhandenen Zeilen gezählt.

          Count(pk) und Count(*) sind somit gleichbedeutend. Und Count(*) ist sicher schneller als Count(column).
          GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

          Kommentar


          • #6
            Ich würde an dieser Stelle nach Sinn trennen, also einmal die Counts abfragen und einmal die News.

            Vllt. auch statt multi-Query UNION benutzen, aber das kommt wohl auf selbe raus
            mysql ist veraltet Mails senden: Ohne Probleme und ohne mail()
            PHP-Code:
            echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>'

            Kommentar


            • #7
              Ja, der UNION-Select wäre der nächste logische Schritt, um aus den 5 Queries, 2 Notwendige zu machen.
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                Danke für die vielen Antworten!

                Also ANSTATT des Multi-Querys sollte ich UNION verwenden, richtig?

                Und zum Verständnis... wäre mein bisheriger Multi-Query schneller als wenn ich ohne Multi-Query gearbeitet hätte und auch ohne UNION?

                Kommentar


                • #9
                  microtime(), probiers aus
                  Relax, you're doing fine.
                  RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                  Kommentar


                  • #10
                    Zitat von dazzle89 Beitrag anzeigen
                    Danke für die vielen Antworten!

                    Also ANSTATT des Multi-Querys sollte ich UNION verwenden, richtig?

                    Und zum Verständnis... wäre mein bisheriger Multi-Query schneller als wenn ich ohne Multi-Query gearbeitet hätte und auch ohne UNION?
                    Die Frage sollte zuerst gestellt werden: Brauche ich micro-optimierte SQL-Queries ?
                    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                    Kommentar


                    • #11
                      Naja... macht es nicht immer Sinn die Querys zu optimieren, auch wenn es sich vielleicht nur um Millisekunden handelt? Solange es nicht zu aufwendig ist

                      Kommentar


                      • #12
                        Optimiere nicht, solange es nicht nötig ist. Durch Optimierungen leidet meistens (oft) die Lesbarkeit des Codes. Halte den Code lesbar und Optimiere erst wenn es nötig wird und nur an den Stellen an denen es sich lohnt.

                        In PHP ist das nicht ganz so deutlich wie beispielsweise in C, wo du durch gewisse Kniffe (Bitwise anstatt Rechnen, ...) Zeit einsparen kannst, dafür aber nurnoch Zeichensalat siehst.
                        Zitat von nikosch
                        Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

                        Kommentar


                        • #13
                          Aber kannst es ja trotzdem mal von der Performance vergleichen, mich würde interessieren, ob der Zeitgewinn (wenn es denn wirklich einen gibt) nicht wieder durch das PHP-seitige entwirren des Ergebnisses verloren geht.
                          Relax, you're doing fine.
                          RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                          Kommentar

                          Lädt...
                          X