Sortierung
Ingo
- datenbank
Hallo & guten Morgen,
ich bin schon total am verzweifeln, die Ausgaben eines Artikels anzeigen, dabei aber die Artikel in Zeile 2 Sortieren und die in Zeile 1 nicht folgendes Beispiel:
1: $res = mysql_db_query($dbase, "SELECT artikel_id,preis,image
2: (DISTINCT name,kurztext)
3: from LP_artikel where rubrik='$rb' AND online='1' LIMIT $initialEntry, $maxEntrys");
4: $num = mysql_num_rows($res);
ich hoffe das ist Verständlich und es kann Jemand helfen, danke für Anregungen, Ingo.
Hallo,
dabei aber die Artikel in Zeile 2 Sortieren und die in Zeile 1 nicht
nein, das geht nicht. Aber vielleicht meinst Du ja Spalten und nicht Zeilen.
folgendes Beispiel:
wie ich mal schrieb:
Wenn es ein SQL-Problem ist, ist SQL-Code sinnvoll, nicht PHP-Code, der SQL-Code erzeugt.
1: $res = mysql_db_query($dbase, "SELECT artikel_id,preis,image
2: (DISTINCT name,kurztext)
3: from LP_artikel where rubrik='$rb' AND online='1' LIMIT $initialEntry, $maxEntrys");
Du hast also in etwa folgendes SQL-Statement:
SELECT
artikel_id,
preis, -- möchtest Du danach sortieren?
image,
DISTINCT name, -- das sollte einen Syntax-Fehler erzeugen
kurztext
FROM
LP_artikel
WHERE
rubrik = {irgendwas}
AND
online = '1'
-- ORDER BY -- ergänze die gewünschte ORDER-BY-Klausel
-- preis
LIMIT
{anfang}, {anzahl}
Wirf DISTINCT raus, DISTINCT als Schlüsselwort gehört zu SELECT:
SELECT DISTINCT -- Gib mir von Datensätzen gleichen Inhalts
{spaltenliste} -- jeweils nur ein einziges Exemplar.
FROM
{tabelle}
Füge eine ORDER-BY-Klausel ein (diese kommt nach der WHERE-Klausel und vor der LIMIT-Klausel) und führe dort die Spalten auf, nach denen sortiert werden soll.
Es ist stets eine gute Idee, ein Beispiel mit ein paar Beispieldatensätzen zu zeigen:
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
erst einmal danke für Hilfe.
die beiden Spalten >> Destinct name, kurztext enthalten doppelte Einträge die ich rausfiltern möchte, klapt auch
1: $res = mysql_db_query($dbase, "SELECT DISTINCT name,kurztext
2: from LP_artikel where rubrik='$rb' AND online='1' LIMIT $initialEntry, $maxEntrys");
jetzt sollten aber die anderen Angaben mit ausgegeben werden ohne Sie zu filtern.
? wohin damit: artikel_id,preis,image
Gruß Ingo
moin,
und wo bleiben die von Vinz geforderten beispieldaten, damit wir hier nicht unsere glaskugeln benutzen müssen und uns ein klares bild von deinem problem machen können ?
Ilja
moin,
und wo bleiben die von Vinz geforderten beispieldaten, damit wir hier nicht unsere glaskugeln benutzen müssen und uns ein klares bild von deinem problem machen können ?
Ilja
Hallo Ilja,
danke für deine Teilname an diesem Problem.
Ich habe in de DB Artikel mit folgenden Spalten artikel_id, name, kurztext, image, preis
Jetzt möchte ich per DESTINCT doppelte Namen(name) filtern, was auch klapp.
Nach dem ich jetzt die artikel habe sollen die restlichen Daten des Artikels mit erscheinen.->alseo image,kurztext,preis
artikel_id art_nr name kurztext image preis
37 102 Spiegel Ein Muster... 37,jpg 15,00
Ist das jetzt so verständlich?
Gruß Ingo
yo,
Ist das jetzt so verständlich?
noch mal den hinweis, den Vinz dir schon gegeben hat. am einfachsten ist es für uns mit beispieldaten, sprich du gibst uns ein paar daten aus deiner tabelle, die das problem kenntlich machen können. und dann zeigst du uns, wie die ergebnismenge aussehen soll. die erklärungen alleine sind leider meistens irreführend.
Nach dem ich jetzt die artikel habe sollen die restlichen Daten des Artikels mit erscheinen.->alseo image,kurztext,preis
was dein problem angeht, wenn du in der tabelle datensätze mit gleichen artikel-namen zu stehen hast, dann hast du auch verschiedene daten dazu, sprich zu zwei datensätze mit dem gleichen artikelnamen kannst du unterschiedliche werte für den preis, dem kurztext oder image haben.
es fragt sich also nun, wenn du aus 2 datensätze nur einen anzeigen willst, weil der artikelname gleich ist, nach welchen kritereien soll man den die anderen spaltenwerte nehmen, der ursprünglich zwei datensätze ?
Ilja
yo,
Ist das jetzt so verständlich?
noch mal den hinweis, den Vinz dir schon gegeben hat. am einfachsten ist es für uns mit beispieldaten, sprich du gibst uns ein paar daten aus deiner tabelle, die das problem kenntlich machen können. und dann zeigst du uns, wie die ergebnismenge aussehen soll. die erklärungen alleine sind leider meistens irreführend.
Nach dem ich jetzt die artikel habe sollen die restlichen Daten des Artikels mit erscheinen.->alseo image,kurztext,preis
was dein problem angeht, wenn du in der tabelle datensätze mit gleichen artikel-namen zu stehen hast, dann hast du auch verschiedene daten dazu, sprich zu zwei datensätze mit dem gleichen artikelnamen kannst du unterschiedliche werte für den preis, dem kurztext oder image haben.
es fragt sich also nun, wenn du aus 2 datensätze nur einen anzeigen willst, weil der artikelname gleich ist, nach welchen kritereien soll man den die anderen spaltenwerte nehmen, der ursprünglich zwei datensätze ?
Ilja
Hallo Ilja,
genau das hast Du richtig verstanden, mit gleichen Namen nur den anzeigen mit dem kleinsten preis wäre gut und von diesem Artikel alle Daten.
Gruß Ingo
yo,
genau das hast Du richtig verstanden, mit gleichen Namen nur den anzeigen mit dem kleinsten preis wäre gut und von diesem Artikel alle Daten.
er kleinste preis also, und hast du dir schon den fall überlegt, wenn der preis der mehrfahren datensätze gleich ist ? was du brauchst ist ein !! eindeutiges !! kriterium, welchen der mehrfach möglichen datensätze du anzeigen willst.
Ilja
yo,
genau das hast Du richtig verstanden, mit gleichen Namen nur den anzeigen mit dem kleinsten preis wäre gut und von diesem Artikel alle Daten.
er kleinste preis also, und hast du dir schon den fall überlegt, wenn der preis der mehrfahren datensätze gleich ist ? was du brauchst ist ein !! eindeutiges !! kriterium, welchen der mehrfach möglichen datensätze du anzeigen willst.
Ilja
Hallo Ilja,
danke für diese Anregung, stimmt daran habe ich nich garnicht gedacht.
Ich hab da noch zwei weitere Kreterien die dann das Ergebnis eingrenzen, das sind "groesse" und "bos"
-> selber(name)->kleinster(preis)->kleinste(groesse)->bsonderheit(bos)->Artikel mit allen Daten zur Ausgabe
weiter kann man das dann nicht mehr differenzieren.
Gruß Ingo
yo,
weiter kann man das dann nicht mehr differenzieren.
du musst die eindeutigkeit sicher stellen können, dafür eigenen sich immer gut den PK oder einen anderen Unqiue wert zu nehmen. deswegen mein vorschlag, nimm den datensatz mit den kleinesten preis und, wenn diese gleich sind, mit den kleinsten PK schlüssel. für die umsetzung wirst du unterabfragen brauchen, diese gehen bei mysql ab version 4.1
Ilja
yo,
weiter kann man das dann nicht mehr differenzieren.
du musst die eindeutigkeit sicher stellen können, dafür eigenen sich immer gut den PK oder einen anderen Unqiue wert zu nehmen. deswegen mein vorschlag, nimm den datensatz mit den kleinesten preis und, wenn diese gleich sind, mit den kleinsten PK schlüssel. für die umsetzung wirst du unterabfragen brauchen, diese gehen bei mysql ab version 4.1
Ilja
Hallo Ilja,
nun gut habe damit noch nie gearbeitet wie müsste soetwas aussehen?
Kannst Du mir da ein Beispiel schreiben?
Wie kann ich z.B. von einem Artikel mit Namen der 10 x vorkommt "name" nach kleinester "preis sortieren", das ist mir noch ein Rätsel.
Gruß Ingo
yo,
Wie kann ich z.B. von einem Artikel mit Namen der 10 x vorkommt "name" nach kleinester "preis sortieren", das ist mir noch ein Rätsel.
du benutzt sogenannte korellierte unterabfragen.
SELECT a.artikel_id, a.name, a.kurztext, a.image, a.preis
FROM tabelle_mit_artikel a
WHERE a.artikel_id = (SELECT MIN(a2.artikel_id)
FROM tabelle_mit_artikel a2
WHERE a2.name = a.name -- hier 1. korrelation
AND a2.preis = (SELECT MIN(a3.preis)
FROM tabelle_mit_artikel a3
WHERE a3.name = a.name -- hier 2. korrelation
)
)
;
Ilja
yo,
Wie kann ich z.B. von einem Artikel mit Namen der 10 x vorkommt "name" nach kleinester "preis sortieren", das ist mir noch ein Rätsel.
du benutzt sogenannte korellierte unterabfragen.
SELECT a.artikel_id, a.name, a.kurztext, a.image, a.preis
FROM tabelle_mit_artikel a
WHERE a.artikel_id = (SELECT MIN(a2.artikel_id)
FROM tabelle_mit_artikel a2
WHERE a2.name = a.name -- hier 1. korrelation
AND a2.preis = (SELECT MIN(a3.preis)
FROM tabelle_mit_artikel a3
WHERE a3.name = a.name -- hier 2. korrelation
)
)
;Ilja
Hallo Ilja,
danke für diese Ausführung, soetwas habe ich nich nie gemacht, sieht nicht gerade leicht zum Verständnis aus.
Ich weis nur nicht so recht was da noch als klausel rein soll?
SELECT a.artikel_id, a.name, a.kurztext, a.image, a.preis
FROM artikel a
WHERE a.artikel_id = (SELECT MIN(a2.artikel_id)
FROM artikel a2
WHERE a2.name = a.name -- hier 1. was soll hier rein?
AND a2.preis = (SELECT MIN(a3.preis)
FROM artikel a3
WHERE a3.name = a.name -- hier 2. was soll hier rein?
)
)
;
Doppelte Namen filtern ->
kleinsten preis der Namengruppe ermitteln ->
Hilfe ich raf deas nicht.
Ingo
yo,
Doppelte Namen filtern ->
kleinsten preis der Namengruppe ermitteln ->
passiert alles schon, du musst nur noch auf die richtige tabellenbezeichung und spaltennamen achten, ausführen und sagen, ob es zu fehlermeldungen kommt.
Ilja
Hallo Ilja,
die Sortierung funktioniert prima jetzt habe ich ber ein Problem da ich vorher die >Rubrik abgfragt "where rubrik='$rb' AND online='1'" denn jetzt werden alle Artikel aus allen Kategorien angezeigt.
So sieht das jetzt aus:
$res = mysql_db_query($dbase, "SELECT a.artikel_id, a.name, a.kurztext, a.image, a.preis
FROM LP_artikel a
WHERE a.artikel_id = (SELECT MIN(a2.artikel_id)
FROM LP_artikel a2
WHERE a2.name = a.name
AND a2.preis = (SELECT MIN(a3.preis)
FROM LP_artikel a3
WHERE a3.name = a.name
)
)
");
Ich danke Dir Ilja für deine Hilfe.
yo,
es ist keine sortierung, sondern eine selektion. außerdem noch mal den hinweis, wenn du fragen zu datenbanken und sql hast, bitte nur das reine sql posten, kein code aus php oder sonstige programmiersprachen.
du musst einfach nur die beiden zusätzlichen bedigungen an die abfrage mit dem AND operator verknüpfen.
SELECT a.artikel_id, a.name, a.kurztext, a.image, a.preis
FROM LP_artikel a
WHERE a.artikel_id = (SELECT MIN(a2.artikel_id)
FROM LP_artikel a2
WHERE a2.name = a.name
AND a2.preis = (SELECT MIN(a3.preis)
FROM LP_artikel a3
WHERE a3.name = a.name
)
)
AND a.rubrike = 'hier_wert_für_rubrik'
AND a.online = 1
;
Ilja
yo,
es ist keine sortierung, sondern eine selektion. außerdem noch mal den hinweis, wenn du fragen zu datenbanken und sql hast, bitte nur das reine sql posten, kein code aus php oder sonstige programmiersprachen.
du musst einfach nur die beiden zusätzlichen bedigungen an die abfrage mit dem AND operator verknüpfen.
SELECT a.artikel_id, a.name, a.kurztext, a.image, a.preis
FROM LP_artikel a
WHERE a.artikel_id = (SELECT MIN(a2.artikel_id)
FROM LP_artikel a2
WHERE a2.name = a.name
AND a2.preis = (SELECT MIN(a3.preis)
FROM LP_artikel a3
WHERE a3.name = a.name
)
)
AND a.rubrike = 'hier_wert_für_rubrik'
AND a.online = 1
;Ilja
Hallo Ilja,
bin wohl einschwieriger Fall, werd mal ein bischen Probieren was ich erhalte dei Änderungen.
Besten Dank Ilja und ein angenehmes Wochenende
Gruß Ingo
P.S. mit dem Code werd ich mir hinter die Ohren schreiben, bye!
Hi,
die beiden Spalten >> Destinct name, kurztext enthalten doppelte Einträge die ich rausfiltern möchte, klapt auch
jetzt sollten aber die anderen Angaben mit ausgegeben werden ohne Sie zu filtern.
? wohin damit: artikel_id,preis,image
Du hast also mehrere artikel_id-Werte mit dem selben name- und kurztext-Wert? Dann musst Du dem DBMS mitteilen, welche artikel_id Du haben möchtest. Verwende hierzu Gruppenfunktionen. DISTINCT nützt Dir exakt gar nichts, weil es auf das gesamte Statement angewendet wird.
Cheatah
Hi,
die beiden Spalten >> Destinct name, kurztext enthalten doppelte Einträge die ich rausfiltern möchte, klapt auch
jetzt sollten aber die anderen Angaben mit ausgegeben werden ohne Sie zu filtern.
? wohin damit: artikel_id,preis,imageDu hast also mehrere artikel_id-Werte mit dem selben name- und kurztext-Wert? Dann musst Du dem DBMS mitteilen, welche artikel_id Du haben möchtest. Verwende hierzu Gruppenfunktionen. DISTINCT nützt Dir exakt gar nichts, weil es auf das gesamte Statement angewendet wird.
Cheatah
Hi Cheatah,
danke für den Tipp, aber könnstest Du ein Beispiel nennen wie ich so eine Gruppenfunktion anwenden sollt, danke?
Gruß Ingo
Hi,
danke für den Tipp, aber könnstest Du ein Beispiel nennen wie ich so eine Gruppenfunktion anwenden sollt, danke?
nach was hast Du gesucht, was hast Du gefunden, was ausprobiert, auf welche Probleme bist Du gestoßen?
Cheatah