Ankündigung

Einklappen
Keine Ankündigung bisher.

Sticky Posts und Order

Einklappen

Neue Werbung 2019

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

  • Sticky Posts und Order

    Hi,

    ich hab folgendes Problem. Nehmen wir an, ich habe diese tabelle:

    Posts:
    Code:
    ID   Content   Type       Date
    ####################################
    1    lalala    normal     1276498938
    2    blubb     normal     1276498939
    3    foo       sticky     1276499085
    4    bar       normal     1276499180
    Jetzt mache ich diese Abfrage:

    Code:
    SELECT ID,Content FROM Posts ORDER BY Date DESC
    und möchte, dass die mit dem Type = Sticky "bevorzugt" behandelt werden, also als erstes Ergebnis geliefert werden. Wie füge ich das in o.g. Abfrage ein?


  • #2
    ORDER BY Type DESC, Date DESC

    Kommentar


    • #3
      Naja das ist eine Beispieltabelle, es gibt noch andere Types. Will nicht zwingend noch eine Spalte machen.

      Kommentar


      • #4
        alternativ:
        Code:
        SELECT ID,Content FROM Posts ORDER BY IF(Type = "sticky", 9999999999, Date) DESC
        "My software never has bugs, it just develops random features."
        "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

        Kommentar


        • #5
          Code:
          SELECT ID,Content 
          FROM test 
          ORDER BY IF(Type = "sticky", 9999999999, 
                        IF (Type = "anotherType", 9999999998, Date)) DESC
          "My software never has bugs, it just develops random features."
          "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

          Kommentar


          • #6
            möglich wäre auch dies...

            Da wird vor das Datum eine Art Priorität "1" bzw "9" angehängt. Das funktoniert natürlich nur bei DESC so korrekt, bei ASC müsste "1" die bei "sticky" stehen und "9" bei "normal".

            Code:
            CREATE TABLE posts (
             id INT NOT NULL,
             content VARCHAR(50) NOT NULL,
             type VARCHAR(10) NOT NULL,
             datum DATE NOT NULL
            );
            
            INSERT INTO posts VALUES
            ( 1, 'lalala', 'normal', '2010-06-01'),
            ( 2, 'blub', 'normal', '2010-06-02'),
            ( 3, 'foo', 'sticky', '2010-06-02'),
            ( 4, 'bar', 'normal', '2010-06-03');
            
            
            SELECT id, content, type, datum
              FROM posts
             ORDER BY CASE type
                       WHEN 'sticky' THEN CONCAT('9' , CAST(datum AS CHAR) )
                       ELSE  CONCAT('1' , CAST(datum AS CHAR) )
                      END DESC;
                      
            
            +----+---------+--------+------------+
            | id | content | type   | datum      |
            +----+---------+--------+------------+
            |  3 | foo     | sticky | 2010-06-02 |
            |  4 | bar     | normal | 2010-06-03 |
            |  2 | blub    | normal | 2010-06-02 |
            |  1 | lalala  | normal | 2010-06-01 |
            +----+---------+--------+------------+
            4 rows in set (0.01 sec)
            
            mysql>
            Wäre mehr SQL-Standard und flexibler wenn mal mehr als ein Type speziell behandelt werden soll.

            Grüße
            Thomas

            Kommentar


            • #7
              habs noch ein wenig angepasst, falls du deine Tabelle nicht ändern willst.
              Hab das CASE-WHEN Konstrukt von thomas genommen, ist mit Sicherheit flexibler, wie er es gesagt hat:
              Code:
              INSERT INTO `posts` (`ID`, `Content`, `Type`, `Date`) VALUES
              (1, 'lalala', 'normal', 1276498938),
              (2, 'blub', 'normal', 1276498939),
              (3, 'foo', 'sticky', 1276499085),
              (4, 'bar', 'normal', 1276499180),
              (5, 'wuff', 'pipe', 1276499280),
              (6, 'moep', 'ropy', 1276499380);
              
              
              SELECT ID, Content, TYPE 
              FROM posts
              ORDER  BY  CASE  TYPE 
                    WHEN  'sticky' THEN 9999999999 
                    WHEN  'ropy' THEN 9999999998 
                    WHEN  'pipe' THEN 9999999997 
                    ELSE  `Date` 
                  END  DESC 
              LIMIT 0 , 30
              "My software never has bugs, it just develops random features."
              "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

              Kommentar


              • #8
                Zitat von Paul.Schramenko Beitrag anzeigen
                Code:
                ORDER  BY  CASE  TYPE 
                      WHEN  'sticky' THEN 9999999999 
                      WHEN  'ropy' THEN 9999999998 
                      WHEN  'pipe' THEN 9999999997 
                      ELSE  `Date` 
                    END  DESC
                Damit wird aber nur nach diesem Kriterium sortiert - bei mehreren Einträgen gleichen Typs ist deren Sortierung dann wieder beliebig.



                Statt wie von Thomas vorgeschlagen, mit CONCAT zu arbeiten, kann man auch einfach nach beiden (oder mehr) Kriterien nacheinander sortieren:
                Code:
                ORDER  BY
                  (CASE type 
                    WHEN 'sticky' THEN 1
                    WHEN 'ropy' THEN 2
                    WHEN 'pipe' THEN 3
                    ELSE 4
                  END) ASC,
                  date DESC

                Kommentar


                • #9
                  Ja, stimmt ChrisB, das ist die beste Lösung, hab soweit vorhin nicht gedacht.
                  "My software never has bugs, it just develops random features."
                  "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                  Kommentar


                  • #10
                    Ich will mal einwerfen das es sinnvoller wäre die Priorität gleich als Zahl abzuspeichern, hat ja noch niemand gesagt oder?

                    Kommentar


                    • #11
                      Das ginge über einen LEFT JOIN auf eine andere Tabelle. In der selben Tabelle würde ich das nicht tun.
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar

                      Lädt...
                      X