php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 02.05.2008, 16:11  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard sortierung

hi,

ist mehr eine frage die in richtung datenintegrität geht, deswegen stelle ich das ins mysql forum:

ausgangslage:

tabelle (news) articles - vereinfacht, sortiert nach sortierung:

Code:
id  --- sortierung
2   --- 1
1   --- 2
3   --- 3
so wird das auch in einer übersicht ausgegeben. daneben sollen 2 links sein (mit hintergrundbild pfeil nach oben / pfeil nach unten) durch die die sortierung um eins erhöht, bzw. um eins gesenkt werden kann. ergo sollen also 2 sortierungen vertauscht werden (bsp. id[3] auf sortierung[2], dafür id[2] auf sortierung[3]).

allerdings gibts da 2 probleme:

1. maximal 1 autoincrement möglich, wenn ich das also so irgendwie hinbekomme, müsste ich zur identifizierung eine kombination benützen (trigger möglicherweise nicht möglich).

2. wie erwähnt, datenintegrität. sortierung ist unique.

geht das ohne locks?

gruß und danke![/u]
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 02.05.2008, 22:08  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo, also ob UNIQUE Sinn macht weiss ich nicht, tauschen kannst du zumindest mit einem Query:

UPDATE table SET rank = IF(id = ID1, RANK2, RANK1) WHERE id IN (ID1, ID2)

Dazu muessen ID1, ID2, RANK1 und RANK2 bekannt sein, was aber meistens der Fall ist, wenn du eine Liste aller Eintraege anzeigst. Da ich allerdings QCodo verwende, also kaum noch selbst Queries schreibe, habe ich das so geloest:

PHP-Code:
<?php
class Category extends CategoryGen {
        
// ..

        
public function MoveUp() {
            
self::NormalizeOrder($this->SiteSectionId);
            
$arrSiblings $this->GetSiblings();
            foreach (
$arrSiblings as $i => $objSelf) {
                if (
$i && $this->Id == $objSelf->Id) {
                    
$this->SwapOrder($arrSiblings[$i 1]);
                    break;
                }
            }
        }
        
        public function 
MoveDown() {
            
self::NormalizeOrder($this->SiteSectionId);
            
$intSiblings $this->CountSiblings();
            
$arrSiblings $this->GetSiblings();
            foreach (
$arrSiblings as $i => $objSelf) {
                if ((
$intSiblings $i) && $this->Id == $objSelf->Id) {
                    
$this->SwapOrder($arrSiblings[$i 1]);
                    
$blnMove true;
                }
            }
        }
        
        
/**
         * static because must be called after deleting a category
         *
         * @param unknown_type $intSiteSectionId
         */
        
public static function NormalizeOrder($intSiteSectionId) {
            
            foreach (
Category::LoadArrayBySiteSectionId($intSiteSectionId) as $i => $objCategory) {
                if (
$objCategory->Order != $i) {
                    
$objCategory->Order $i;
                    
$objCategory->Save();
                }
            }
        }
        
        public function 
SwapOrder(self $objSelfSwap) {
            
$intOrder $this->Order;
            
$intOrderSelfSwap $objSelfSwap->Order;
            
            
$this->Order $intOrderSelfSwap;
            
$objSelfSwap->Order $intOrder;
            
            
$this->Save();
            
$objSelfSwap->Save();
        }
        
        public function 
GetNextOrder() {
            return 
self::CountBySiteSectionId($this->SiteSectionId);
        }

        
// ..
        
        
public function Save($blnForceInsert false$blnForceUpdate false) {
            if (
is_null($this->Order)) {
                
$this->Order $this->GetNextOrder();
            }
            return 
parent::Save($blnForceInsert$blnForceUpdate);
        }
}
?>
Das Feld "order" (vorsicht, reserviertes Wort , vielleicht waere "rank" besser) ist vom Type NULL SMALLINT. Sortiert wird die Category nach "order ASC, title ASC". NOT NULL waere auch moeglich.
Zergling-new ist offline   Mit Zitat antworten
Alt 03.05.2008, 11:26  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

update befehl von Zergling ist richtig.
Die passende ids bekommst du auf diese weise

'SELECT a.id as fid, a.sortierung as ord FROM tabelle as a
where a.id=(select id from tabelle where id=$id_die_angecklickt_wurde)
and a.sortierung'.($top?'<':'>').'=(select sortierung from tabelle where id=$id_die_angecklickt_wurde )
order by ord '.($top?'desc':'asc').' limit 2'

$top bedeutet, dass es nach oben verschoben sein muss.
auf diese weise kannst du mit einem query direkt beide möglichkeiten abdecken, also nach oben und nach unten. Du brauchst also nur die id, die verschoben sein muss und die Richtung (oben oder unten)
__________________
Slava
http://bituniverse.com
Slava ist offline   Mit Zitat antworten
Alt 03.05.2008, 15:15  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Slava
update befehl von Zergling ist richtig.
Die passende ids bekommst du auf diese weise

'SELECT a.id as fid, a.sortierung as ord FROM tabelle as a
where a.id=(select id from tabelle where id=$id_die_angecklickt_wurde)
and a.sortierung'.($top?'<':'>').'=(select sortierung from tabelle where id=$id_die_angecklickt_wurde )
order by ord '.($top?'desc':'asc').' limit 2'

$top bedeutet, dass es nach oben verschoben sein muss.
auf diese weise kannst du mit einem query direkt beide möglichkeiten abdecken, also nach oben und nach unten. Du brauchst also nur die id, die verschoben sein muss und die Richtung (oben oder unten)
ist klar, es ging nie um den select befehl, sondern um den update befehl. bei select muss ich mir für die ausgabe ja "sortierung" mitliefern lassen. das problem war immer der "atomare" update befehl.

ich muss am montag auf der arbeit mal weiterschauen, da ich mir zerg's QCodo mal angucken muss :wink: melde mich dann wieder
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Alt 05.05.2008, 17:41  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

hat geklappt, man dankt!
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Alt 05.05.2008, 18:42  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Welcher Befehl, der von Slava? Dann schieb ich den gleich mal in meine Lesezeichen!
Zergling-new ist offline   Mit Zitat antworten
Alt 05.05.2008, 19:53  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Zergling
Welcher Befehl, der von Slava? Dann schieb ich den gleich mal in meine Lesezeichen!
dann aber sofort raus damit!! war nämlich deiner:

Zitat:
UPDATE table SET rank = IF(id = ID1, RANK2, RANK1) WHERE id IN (ID1, ID2)
ich nehm mir einfach rang mit und fertisch. das sieht auch schöner aus als slavas *schauder* sub-selects. zudem ja der vorteil, das maximal 1 nach oben bzw. 1 nach unten verschoben werden muss....
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sortierung eines Arrays nach ANZAHL Werte simsalabim PHP Tipps 2008 5 06.11.2007 13:44
Sortierung eines Arrays vollkommenegal PHP-Fortgeschrittene 5 14.07.2007 21:12
TIME Sortierung falsch cyberholic Datenbanken 1 06.11.2006 22:21
Sortierung nach punkten und Tordifferenz xXx PHP Tipps 2006 12 08.04.2006 16:28
Dynamische Sortierung phpbeginner PHP Tipps 2006 4 25.02.2006 21:39
Eigene Sortierung bei der SQL-Abfrage Datenbanken 14 09.02.2006 10:53
mySQL : deutsche Sortierung malabarista PHP Tipps 2007 7 18.12.2005 13:22
SQL sortierung fehlerhaft... Datenbanken 12 08.12.2005 13:29
[Erledigt] varchar zur php timestamp sortierung geeignet? Datenbanken 4 14.07.2005 17:13
MySQL abfrage mit berechneter Sortierung Dragon26mFR Datenbanken 5 08.05.2005 14:01
Sortierung der Ausgabe PHP-Fortgeschrittene 3 08.10.2004 09:22
Sortierung der NULL-Inhalte Datenbanken 3 28.09.2004 22:16
[Erledigt] sortierung vom user aus Datenbanken 10 23.09.2004 18:02
Gleiche Abfrage, unterschiedliche sortierung juhuwoorps Datenbanken 2 05.09.2004 00:51

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php sortieren von unten nach oben

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.