php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 02-04-2008, 16:12
strassencoder
 Newbie
Links : Onlinestatus : strassencoder ist offline
Registriert seit: Jan 2006
Beiträge: 35
strassencoder ist zur Zeit noch ein unbeschriebenes Blatt
strassencoder eine Nachricht über Yahoo! schicken
Standard Verständnisfrage: Techniken zur Ausgabereihenfolge

Liebe Gemeinde,

ich habe eine Denkblockade und hab schon versucht hier zu suchen, aber ich denke ich habe eine so banale Frage das ich wahrscheinlich nach den falschen Keywords suche und google.

Die Frage, wie kann ich die Reihenfolge einer mysql ergebnistabelle manuell bestimmen.

Ich mache kurz ein Beispiel:
Ich möchte in meinem eigenen Webshopsystem einige Artikel vor andere Stellen, und das eigentlich sehr komfortabel gestalten.

Ich habe nun z.B. eine Tabelle bestehend aus "id","artikelname","preis" und dem Feld "order"

bisher habe ich manuell in das Feld order eine Zahl geschrieben von 1-1000 und dann ein SELECT FROM `artikel` ORDER BY `order` ASC o. DESC gemacht.

in meiner Administration habe ich eine kleine php-function die bei klick auf "nach oben" den wert `order` um 1 verkleinert oder vice versa vergrössert.

und da liegt der Hundbegraben, irgendwann mal hat man das volle chaos da viele Einträge die gleiche Nummer haben. nun muss man 3-4 mal auf das "nach oben" klicken bis man das Ziel erreicht, also der eine Eintrag vor allen anderen ist etc.

Ich habe mir auch schon Gedanken gemacht mit Grösseren Zahlen zu arbeiten, bzw die Fortlaufende id ( z.B. 135 ) + 1000 zu nehmen und dann mit +- 100 zu arbeiten, dann hat man wenigstens nicht mehr die identischen Einträge im meinem Feld `order`.

Hat mir jemand einen Denkansatz? Mir geht es in erster Linie ums Verständnis. Wie machen dass denn andere Shops bzw Blogs oder so.

Da gibts bestimmt nen gaaaanz einfachen Trick.

Vielen Dank.

Andre der Strassencoder
Mit Zitat antworten
  #2 (permalink)  
Alt 02-04-2008, 16:25
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Normalerweise ordnet man nur nach Datum, Titel oder Autor, das ist ja mit SQL einfach zu bewerkstelligen. Wenn du manuelle sortieren willst wäre es am sinnvollsten beim verschieben alle anderen Einträge auch zu ändern. Einen ähnlichen (nur noch komplexeren) Ansatz verfolgen Nested Sets, hier gehts um eine Anordnung in mehreren Dimensionen, informier dich mal darüber.

Du müsstest also wenn du einen Eintrag verschiebst alle Eintrag darunter auch verschieben:
Code:
UPDATE TABLE entries SET order + 1 WHERE order < 15
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #3 (permalink)  
Alt 02-04-2008, 16:28
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Hallo,

zuerst solltest du bei deiner nachOben-Funktion halt noch darauf achten dass der Order-Wert des Datensatzes der vorher an der Stelle war um 1 erhöht wird. Außerdem solltest du ggf. auch drauf achten, dass der Wert in Order nicht in den Minus-Bereich wandern kann (nachOben-Klick beim ersten Produkt nicht mehr anzeigen und auch PHP-Seitig verhindern dass das geschieht).

Zur Sicherheit könntest du (z.B. per Cronjob) regelmässig ein Script laufen lassen, dass alle Datensätze nach Order sortiert ausliest und ein Update fährt, dass die Sortierung komplett neu von 1 beginnend schreibt.
Mit Zitat antworten
  #4 (permalink)  
Alt 02-04-2008, 16:40
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von tontechniker
Du müsstest also wenn du einen Eintrag verschiebst alle Eintrag darunter auch verschieben:
Code:
UPDATE TABLE entries SET order + 1 WHERE order < 15
Wieso das? Wenn ich in der Sortierten Liste ein bestimmtes Element um eine Position nach oben bringen will, dann werden eigentlich nur die Positionen des nach oben zu bringenden Elements und dem dass davor die Platzierung inne hatte getauscht. Eigentlich keine große Sache...

Oder versteh ich da grad was falsch

Etwas besser muss man erst aufpassen, wenn man ein Element um z.B. 5 Positionen nach oben haben will - dann muss man halt die Sortierung der 5 Elemente die zuvor darüber waren neu schreiben.
Mit Zitat antworten
  #5 (permalink)  
Alt 02-04-2008, 16:41
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Quetschi
Außerdem solltest du ggf. auch drauf achten, dass der Wert in Order nicht in den Minus-Bereich wandern kann
Das sollte eigentlich für ein reines Sortierfeld überhaupt kein Problem sein.
__________________
Gruss
H2O
Mit Zitat antworten
  #6 (permalink)  
Alt 02-04-2008, 16:44
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

- dem Feld order einen anderen Namen geben
- beim "hochsetzen" des Eintrags den Eintrag mit dem nächsthöheren Wert updaten und ihm den alten des hochzusetzenden Eintrags geben
- den Wert des hochzusetzenden Eintrags um 1 inkrementieren

So würde ich es machen. Beim heruntersetzen eben andersrum.
Mit Zitat antworten
  #7 (permalink)  
Alt 02-04-2008, 16:45
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von H2O
Das sollte eigentlich für ein reines Sortierfeld überhaupt kein Problem sein.
Meinst du weil ein Sortierfeld unsigned sein sollte? Ansonsten ist es halt so, dass ungeduldige User vielleicht 2 oder 3mal auf den nachOben-Link drücken wenn der Webserver nicht gleich in der nächsten zehntel-Sekunde die neu sortierte Liste ausspuckt.
Mit Zitat antworten
  #8 (permalink)  
Alt 02-04-2008, 16:50
strassencoder
 Newbie
Links : Onlinestatus : strassencoder ist offline
Registriert seit: Jan 2006
Beiträge: 35
strassencoder ist zur Zeit noch ein unbeschriebenes Blatt
strassencoder eine Nachricht über Yahoo! schicken
Standard

Hallo Tontechniker,

genau davor habe ich irgendwie Angst, alle anderen Einträge auch zu ändern, da der Shop von im Moment 200 Artikel auf sagen wir mal 20000 evtl gehen soll, dann könnte ich in einem ungünstigen Fall 800 Einträge ändern da ich den 801 Artikel ganz vorne haben will.

Was sagt da die DB-Performance.

Ich weiß das klinkt komisch, aber kann da was passieren / steckenbleiben / irreparabel beschädigt werden wenn ich so einen Query wie
PHP-Code:
UPDATE TABLE entries SET order 1 WHERE order 15 
jedesmal ausführe wenn ich auf `nach oben` klicke oder muss ich mir da keine Gedanken machen.

Hmm.... Nestes sets, da google ich mal ...

Klar kann ich nach Datum, Author, Titel etc sortieren, macht aber leider bei mir keinen Sinn, in meinem Webshop will ich wenn z.B. eine Ausverkaufsaktion ist, die 6 Top-Seller ganz nach vorne, und den Rest neu sortieren, so ein bisschen Verkaufspsychologie anwenden.

An Quetschi - das ist eine gute Idee, einen Cron job laufen lassen der mir quasi das Feld `order` dann neu strickt. Hmmm...

ich bin auch immernoch am überlegen meiner 1000er Schritte idee bzw dann 100000 Schritte idee, da ich ja dann wenn ich die unique `id` + 100000 nehm und dann statt +-1 eben +-1000 nehme dann habe so gut wie nie den selben wert. Geht dann halt so ausm stehgreif glaub nur bei 999 Einträgen gut

Das verhindern negativer Einträge habe ich schon gemacht, bzw am eigen Leib spüren müssen... Das Problem mit dem nächsten Eintrag um einen Zähler erhöhen habe ich schon, da ich mir dann ja evtl die nächste dublette schaffe. Da kommt Tontechnikers Ansatz alle Einträge zu ändern ins Spiel.

Nunja im Moment ist das Problem eben die Dubletten, Quadretten etc ich habe halt 20x order=9 , 7x order = 19 etc.

Vielen Dank für die Antworten bisher.

Ich denke mit eurer Hilfe wird der Denkprozess wesentlcih vereinfacht.

Grüsse von Andre dem Strassencoder


NACHTRAG:
Huch während ich schrieb kamen noch mehr Antworten...

Mir fällt da aber noch was anderes ein. da ich ja alle Artikel in der gleichen Tabelle habe, aber nur die brauche die in der gleichen Warengruppe sind, wirds mit ner "allgemeinen" Update anweisung schwieriger.

Andere Frage: Ich habe irgendwie sowas wie "Sortierfeld" gelesen.
kann eine neue Tabelle evtl helfen, also quasi eine Sortiertabelle für meine Artikeltabelle, oder macht das keinen Unterschied, denn in meiner Sortiertabelle habe ich ja nur 3 Felder ( id, artikelid und order)....

Geändert von strassencoder (02-04-2008 um 16:58 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 02-04-2008, 16:56
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von strassencoder
An Quetschi - das ist eine gute Idee, einen Cron job laufen lassen der mir quasi das Feld `order` dann neu strickt. Hmmm...
Also das solltest du erstmal machen, wenn die Sortierung schon "Lücken" hat oder bestimmte "Sortiernummern" schon doppelt vergeben sind. Ansonsten ist es halt nur für den Fall gedacht, dass aus welchen Gründen auch immer, sich mal ebensolche Fehler in die Sortierspalte einschleichen.

Ansonsten hat es @unset knackig kurz und gut beschrieben wie es gemacht werden sollte - meins weiter oben war halt die längere Ausführung dazu.

So und nicht anders würd ich sowas machen.
Mit Zitat antworten
  #10 (permalink)  
Alt 02-04-2008, 17:01
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Wie gesagt - das Codebeispiel von tontechniker hab ich ned ganz verstanden Vielleicht kann er dazu nochmal kurz was sagen, wie das gedacht ist?
Mit Zitat antworten
  #11 (permalink)  
Alt 02-04-2008, 17:04
strassencoder
 Newbie
Links : Onlinestatus : strassencoder ist offline
Registriert seit: Jan 2006
Beiträge: 35
strassencoder ist zur Zeit noch ein unbeschriebenes Blatt
strassencoder eine Nachricht über Yahoo! schicken
Standard

Ja @unsets idee klingt gut ich muss mal eben kurz drüber nachdenken, und ein paar Fälle durchüberlegen.

ähhh... neee.. da ist je wieder das Problem der Dublette - oder ?

also sagen wir mal 4 Einträge ( 1.id,2.name,3.order/bzw 3.dieReihenfolge )

1 socken 10
2 schuhe 11
3 hemden 12
4 hosen 13

jetzt klicke ich bei hosen auf "nach oben"
was passiert:

3 hemden 12 bekommt nun die "13" von hosen und nun wird 13-1 gemacht ... hmm ok jetzt wo ichs getippt hab, hab ichs glaub begriffen

Ich poste es trotzdem mal.

Danke für die Unterstützung
Mit Zitat antworten
  #12 (permalink)  
Alt 02-04-2008, 17:10
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von strassencoder
Ja @unsets idee klingt gut ich muss mal eben kurz drüber nachdenken, und ein paar Fälle durchüberlegen.

ähhh... neee.. da ist je wieder das Problem der Dublette - oder ?

also sagen wir mal 4 Einträge ( 1.id,2.name,3.order/bzw 3.dieReihenfolge )

1 socken 10
2 schuhe 11
3 hemden 12
4 hosen 13

jetzt klicke ich bei hosen auf "nach oben"
was passiert:

3 hemden 12 bekommt nun die "13" von hosen und nun wird 13-1 gemacht ... hmm ok jetzt wo ichs getippt hab, hab ichs glaub begriffen

Ich poste es trotzdem mal.

Danke für die Unterstützung
Ich glaub ich versteh dein Problem schon - ich würd zuerst die IDs der beiden zu wechselnden Datensätze ermitteln. Du solltest dann also z.B. 2 Variablen haben

$nachObenID = 13;
$nachUntenID = 12;

damit dann:

Update .... set sortierspalte = sortierspalte + 1 WHERE ID = $nachUntenID
und
Update .... set sortierspalte = sortierspalte - 1 WHERE ID = $nachObenID

Du siehst - IDs sind ne tolle Sache
Mit Zitat antworten
  #13 (permalink)  
Alt 02-04-2008, 17:15
strassencoder
 Newbie
Links : Onlinestatus : strassencoder ist offline
Registriert seit: Jan 2006
Beiträge: 35
strassencoder ist zur Zeit noch ein unbeschriebenes Blatt
strassencoder eine Nachricht über Yahoo! schicken
Standard

Ja, bzw sortierfelder sind ne tolle Sache wenn man den Trick weiß...

aber dank unsets gutem Vorschlag, denke ich bekomme ich es spielend hin.

denn da kann ja nix mehr schiefgehen, vorrausgesetzt beim neu-anlegen der Artikel ist eine Fortlaufende nummer drin,

dann noch nach löschen eines Artikels, sollte der Job laufen, der die Nummern wieder fortlaufend macht - und gut.

Vielen Dank, ich bin der Meinung mir wurde geholfen.
Mit Zitat antworten
  #14 (permalink)  
Alt 02-04-2008, 17:30
strassencoder
 Newbie
Links : Onlinestatus : strassencoder ist offline
Registriert seit: Jan 2006
Beiträge: 35
strassencoder ist zur Zeit noch ein unbeschriebenes Blatt
strassencoder eine Nachricht über Yahoo! schicken
Standard

Eine Frage hätte ich noch: klingt komisch aber auf die schnelle fällt mirs net ein:

Wie bekomme ich den Eintrag davor ?

Wenn der zu ändernde Eintrag die id=137 hat und der davor 132

Jetzt wirds für mich verzwickt, da meine SQL-Kenntnisse auf SELECT FROM basieren

Also auf PHP-Ebene würde ich alles in ein array tun und dann die vorausgehende `id` im Array abfragen... aber das geht bestimmt auch direkt im SQL

SELECT * FROM `artikel` WHERE `id` = '137' ( LIMIT -1 wäre net schlecht, gibts aber net)

Gruß Andre
Mit Zitat antworten
  #15 (permalink)  
Alt 02-04-2008, 17:39
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zuerst ermittelst du die Sortiernummer vom DS mit der ID 137 - wie das geht sollte ja soweit klar sein ;-)

Danach:

SELECT * FROM `artikel`
WHERE `sortierspalte` < 'Sortiernummervon137'
ORDER BY `sortierspalte`DESC
LIMIT 1
Mit Zitat antworten
Antwort

Lesezeichen


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

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:20 Uhr.