php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 15-11-2007, 07:16
Joxa
 Registrierter Benutzer
Links : Onlinestatus : Joxa ist offline
Registriert seit: Jul 2005
Beiträge: 29
Joxa ist zur Zeit noch ein unbeschriebenes Blatt
Standard Sortierproblem in MySQL

Hallo,
ich versuche eine MySQL-Abfrage in einer bestimmten Reihenfolge auszugeben. Folgender Ablauf:

1. Mysql-Abfrage

Ließt Datensätze aus der Datenbank aus und sortiert per RAND().
Danach werden nur die ID´s in der Reihenfolge in einem Array gespeichert.

Wird die Seite jetzt erneut aufgerufen frage ich mit einer neuen Abfrage nur die ID´s aus dem Array ab,
leider sortiert er diese jetzt scheinbar willkürlich,

PHP-Code:
Select from ... where id=21 or id=or id=.... 
bzw. nicht in der reihenfolge wie sie im Array stehen.
Ich kann in der 2. Abfrage aber auch kein Sort einfügen, da dies ja auf alle Fälle eine unterschiedliche Reihenfolge zum ersten Ergebnis zur Folge hätte.

Kann ich es jetzt irgendwie in der MySQL-Anweisung schon festlegen das ich die ID´s in der gleichen Reihenfolge, wie in der Abfrage, haben möchte?

Muss ich das Ergebnisarray sortieren?
Oder muss ich evtl. doch jede ID einzeln abfragen und die Ergebnisse nach den Abfragen zusammenfassen?

Any Ideas?
Mit Zitat antworten
  #2 (permalink)  
Alt 15-11-2007, 07:53
ezkimo
 Registrierter Benutzer
Links : Onlinestatus : ezkimo ist offline
Registriert seit: Apr 2005
Ort: Beckum / Westf.
Beiträge: 279
ezkimo befindet sich auf einem aufstrebenden Ast
ezkimo eine Nachricht über ICQ schicken
Standard

Hm ...

Gedankengang 1:
PHP-Code:
$id_ary = array(1,5,8,9,345, ...);
$sql "SELECT * FROM table_name WHERE id IN (" implode(","$id_ary) . ""
Gedankengang 2:
PHP-Code:
$id_ary = array(1,5,8,9,345, ...);
foreach (
$id_ary as $value) {
    
$sql "SELECT * FROM table_name WHERE id = " . (int) $value "";
    
// Ausgabe der Daten ...

Sollte im Grunde genommen funktionieren.
Mit Zitat antworten
  #3 (permalink)  
Alt 15-11-2007, 08:31
Joxa
 Registrierter Benutzer
Links : Onlinestatus : Joxa ist offline
Registriert seit: Jul 2005
Beiträge: 29
Joxa ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hätte ich ja auch vermutet,
dein erster Gedankengang war auch meiner,
nur leider spuckt sql die Ergebnisse nicht in der Reihenfolge aus, wie die id´s im Array stehen.
Mit Zitat antworten
  #4 (permalink)  
Alt 15-11-2007, 08:55
Paranoia
 Newbie
Links : Onlinestatus : Paranoia ist offline
Registriert seit: Jul 2003
Beiträge: 64
Paranoia ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Den Sinn habe ich irgendwie nicht so ganz verstanden. Wieso ist die 2. ABfrage überhaupt notwendig wenn du schon in der ersten Abfrage genau die gewünschten Ergebnisse in der gewünschten Reihenfolge bekommst?
Mit Zitat antworten
  #5 (permalink)  
Alt 15-11-2007, 09:11
Joxa
 Registrierter Benutzer
Links : Onlinestatus : Joxa ist offline
Registriert seit: Jul 2005
Beiträge: 29
Joxa ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Also, vieleicht noch etwas zum Umfeld des ganzen.

Es geht um eine Suchfunktion, mit relativ vielen Einträgen, deswegen möchte ich die Abfragen immer so schlank wie möglich halten.

Die ID´s der gesamten Einträge speichere ich in ein Array. Und bei den verschiedenen Seiten frage ich dann auch nur die entsprechenden id´s aus dem array ab.
Das funktioniert ja auch alles wunderbar, bis auf das im array z.B. steht:

8/15/4/367/12

und ausgegeben wird in der Reihenfolge:

15/4/12/8/367
Mit Zitat antworten
  #6 (permalink)  
Alt 15-11-2007, 09:12
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

@Paranoia: Die IDs werden beim einem Request geholt und beim nächsten wieder verwendet. Werden gleich komplette Datensätze geholt (und z.B. in der Session abgelegt) sind diese Daten beim zweiten (u.U. viel später erfolgenden Request) nicht mehr aktuell. In der DB könnten längst andere Daten stehen.

Zum Thema: Um in der Query eine Sortierung vorzugeben, muß man sich ziemlich verbiegen. Man braucht eine Abbildung der IDs auf eine Domäne, so dass die natürliche Ordnung der Domäne zur gewünschten Ordnung im Definitionsbereich führt. Wenn die IDs veränderlich sind, wovon ich mal ausgehe, ist so eine Funktion schwer zu finden.
Deshalb empfehle ich die einfachste Lösung: Machs in PHP.
Hole alle Datensätze und sortiere mit Hilfe des ID-Arrays.
Mit Zitat antworten
  #7 (permalink)  
Alt 15-11-2007, 09:21
Joxa
 Registrierter Benutzer
Links : Onlinestatus : Joxa ist offline
Registriert seit: Jul 2005
Beiträge: 29
Joxa ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke das hab ich mir schon fast gedacht,
nur wie kann ich das relativ schnell umsetzen?
Gibt es eine arrayfunktion die beide arrays miteinander vergleicht und das 2. nach einem vorgegeben Key nach dem Muster des ersten sortiert?

Das Problem ist ja auch:

Im ID-Array stehen eben nur die ids,
das später zu sortierende Array ist ein mehrdimensionales assoziatives Array.
Mit Zitat antworten
  #8 (permalink)  
Alt 15-11-2007, 09:28
ezkimo
 Registrierter Benutzer
Links : Onlinestatus : ezkimo ist offline
Registriert seit: Apr 2005
Ort: Beckum / Westf.
Beiträge: 279
ezkimo befindet sich auf einem aufstrebenden Ast
ezkimo eine Nachricht über ICQ schicken
Standard

Also grundsätzlich würde ich eine Art Cache anlegen. Eine eindeutig zu identifizierende Textdatei, die das Array enthält. Somit ersparst Du Dir die zweite Datenbankabfrage.

Arrays vergleichen kannst Du mit den array_diff() Funktionen.
Mit Zitat antworten
  #9 (permalink)  
Alt 15-11-2007, 09:39
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

@ezkimo: Du möchtest Sessions nachbauen?
Dann läufst du auch in das Konsistenzproblem.

So könnte es gehen:
PHP-Code:
$search = array();
$result mysql_query('SELECT * FROM t WHERE id IN('.implode(',',$ids).')');
while (
$row mysql_fetch_object($result)) {
    
$search[$row->id] = $row;
}

foreach (
$ids as $id) {
    
var_dump($search[$id]);

Mit Zitat antworten
  #10 (permalink)  
Alt 15-11-2007, 10:10
Joxa
 Registrierter Benutzer
Links : Onlinestatus : Joxa ist offline
Registriert seit: Jul 2005
Beiträge: 29
Joxa ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Perfekt !!!
Genial !!!

Ich hatte parallel dazu mir schon angefangen eine Schleifenlösung, mit Zwischenspeicherung und immer wieder vergleichen, aufzubauen, und war schon bei mehr als 100 Zeilen zusätzlicher Code ;o)

Vielen Dank
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 01:05 Uhr.