Antwort
 
Themen-Optionen Thema durchsuchen
Alt 01.12.2006, 13:33 Nach oben    #1
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard Datensätze mit 1:C-Relation auslesen

Hi.

Ich hab zwei Tabellen (MySQL 5.0.*), die ich miteiander verknüpfen will. Vereinfacht:

Code:
news:
id, page_id, created_at

sticky_news
id, page_id, order
In der Tabelle News sind alle News drinnen, in der Tabelle sticky_news nur die News, die als "sticky" markiert wurden. Konkret können bis zu 3 (bzw. n) News-Einträge festgelegt werden, die in der News-Liste immer ganz oben erscheinen sollen. Für diese News wird auch noch eine Reihenfolge festgelegt, die übrigen News darunter sollen in chronologischer Reihenfolge erscheinen.

Ich kann die beiden Tabellen nicht zusammenfassen, da sie einer unterschiedlichen Versionierung unterliegen. Die Reihenfolge richtet sich nach der Version der Komponente, die die News-Liste ausgibt, die einzelnen News werden in den einzelnen Seiten erstellt (es gibt keinen News-Eintrag, der nicht einer Seite zugeordnet ist) und folgen von daher der Versionierung der Seiten.

Nun brauche ich eine Abfrage, die mir n Beiträge ausgibt (deren Text-Feld nicht leer ist) und zwar Sortiert nach "sticky_news.order" und danach nach "news.created_at.

Ich muss also für alle News-Datensätze, die nicht in sticky_news auftauchenden "order"-Wert auf 0 setzen. Geht das in einer Abfrage?

"Gib mir 10 Datensätze sortiert nach `order` DESC, `created_at` DESC mit news.page_id = sticky_news.page_id. Falls ein News-Eintrag (news.page_id) nicht in sticky_news (sticky_news.page_id) auftaucht, dann setze `order` auf 0"

Wäre prima, wenn das ginge und mir jemand zeigen kann, wie es geht.

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.12.2006, 13:42 Nach oben    #2
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 687
Standard

Du hast die Lösung doch schon, du musst nur die Reihenfolge umdrehen: Erst nach Datum und dann nach Sticky sortieren lassen. Und schon sollte es laufen, da bei der Sortierung meiner Meinung nach egal ist, ob in dem Feld etwas steht oder nicht. Oder hast du ein Problem mit der Verknüpfung der Tabellen?
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.12.2006, 14:23 Nach oben    #3
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Zitat:
Zitat von MrNiceGuy Beitrag anzeigen
du musst nur die Reihenfolge umdrehen: Erst nach Datum und dann nach Sticky sortieren lassen.
Versteh ich nicht. Die "sticky"-Einträge sollen ganz oben stehen - unabhängig vom Datum. Dort gibt es z.B. 3 Einträge mit `order` von 3 - 1 (3 soll nach oben). Für alle anderen soll `oder` auf null gesetzt werden und diese sollen nach Datum sorteirt werden.

Zitat:
Oder hast du ein Problem mit der Verknüpfung der Tabellen?
Yep. Ich bin in Sachen MySQL ein ziemlicher Laie und seh halt, dass es mit "WHERE ... AND sticky_news.page_id = news_page_id" nicht gehen kann, da dann ja alle Datensätze ignoriert würen, die nicht auch in der sticky_news-Tabelle repräsentiert sind (und das sind ja alle, die eben nicht als "sticky" markiert sind).

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.12.2006, 18:45 Nach oben    #4
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 687
Standard

Ja, genau das meinte ich doch. Pass mal auf:

Code:
[...] ORDER BY `datum` DESC, `order` DESC [...]
sortiert erst (!) absteigend nach dem Datum und danach (!) sortiert er nach `order` absteigend, was zur Folge hat, dass die mit `order` 3 vor denen mit 2 und die vor denen mit 1 Stehen und alle mit NULL (Der Rückgabewert, wenn das Feld nicht vorhanden ist) kommen zum Schluss und sind dann bereits nach Datum sortiert, weil dies ja als Erstes passiert.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.12.2006, 22:58 Nach oben    #5
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Sicher? Wundert mich ... aber ist auch ein Detail.

Wichtiger ist die Abfrage. Es geht zwar auch in zwei Abfragen (erst die Sticky-News, dann Limit entsprechend runtersetzen und die bereits gefundenen Datensätze (page_id) in eine NOT IN Klausel für die Abfrage auf alle News, sortiert nach Datum eben), aber es würd mich wundern, wenn es da nicht eine Möglickeit gäbe, das in einer zu erledigen.

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.12.2006, 13:18 Nach oben    #6
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 687
Standard

Ich habe eben mal folgendes schnell getestet, bevor ich wieder weiter muss:

Tabelle 1:

id | text | datetime
1 | hallo | 1.11.2006
2 | welt | 2.11.2006
3 | hallo welt | 3.11.2006
4 | kein order 1 | 4.11.2006
5 | kein order 2 | 5.11.2006

Tabelle 2:

id | tbl1_id | order
1 | 2 | 3
2 | 1 | 1
3 | 3 | 2

Abfrage:
Code:
SELECT * FROM `tabelle1` AS `t1` LEFT OUTER JOIN `tabelle2` AS `t2` ON `t2`.`tbl1_id`=`t1`.`id` ORDER BY `t2`.`order` DESC, `t1`.`datetime` DESC
Das Ergebnis sah dann so aus:

id | text | datetime | id | tbl1_id | order
2 | welt | 2.11.2006 | 1 | 2 | 3
3 | hallo welt | 3.11.2006 | 3 | 3 | 2
1 | hallo | 1.11.2006 | 2 | 1 | 1
5 | kein order 2 | 5.11.2006 | NULL | NULL | NULL
4 | kein order 1 | 4.11.2006 | NULL | NULL | NULL


Fazit: Ich hatte unrecht, die Sortierung funktioniert leider doch nicht so, wie ich das zuerst dachte, man muss also doch erst nach dem Order sortieren lassen und dann das Datum sortieren. Ich hänge mal die Test-Tabellen an, dann kannst du dich nochmal selber davon überzeugen.
Angehängte Dateien
Dateityp: txt test.sql.txt (1,5 KB, 6x aufgerufen)
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.12.2006, 15:45 Nach oben    #7
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Wow! Vielen dank!

Basti
(Antwort auf deine Mail folgt noch...)
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

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 sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Auslesen zweier verschiedener Datensätze in einem Query (mySQL) Chr!s Datenbanken 8 14.11.2006 19:57
[PHP] Fremde Webseiten auslesen WarrenFaith Tutorials 3 14.03.2006 15:59
Anzahl der Datensätze ermitteln ehli75 Datenbanken 3 25.05.2005 22:11
[SQL] Zufallsdatensatz auslesen - MySQL 3.23 Ben Tutorials 0 16.03.2005 00:06
daten in array eintragen und auslesen zerberos Allgemeine Java-Programmierung 15 20.02.2005 21:49


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45