Einzelnen Beitrag anzeigen
  #1  
Alt 09.03.2015, 14:49:01
datalink datalink ist offline
Anfänger
 
Registriert seit: Mar 2015
Alter: 53
Beiträge: 3
vorhergehender und nächster Datensatz bei gleichen Values

Hi,

vielleicht kann mir hier einer weiterhelfen, stehe total auf dem Schlauch.

Ich habe eine Tabelle mit Timestamps. Wenn ein Datensatz aufgerufen wird, soll es einen Link zum vorhergehenden und einen zum nächsten Datensatz geben. Problem ist, daß die Timestamps nicht unique sind und die Links dann nicht mehr stimmen.

Beispiel

Tabelle:
Code:
id  | topicid | copyof | onoff | datum      | headline    | text
1   | 1       |        | 0     | 1418770800 | Headline 1a | Text
2   | 2       |        | 1     | 1418770800 | Headline 2a | Text
6   | 2       |        | 1     | 1418770800 | Headline 3a | Text
7   | 2       |        | 1     | 1418598000 | Headline 2c | Text
8   | 2       |        | 1     | 1419375600 | Headline 2d | Text
9   | 1       |        | 1     | 1418770800 | Headline 1b | Text
10  | 1       |        | 1     | 1418857200 | Headline 1c | Text
11  | 1       |        | 0     | 1418770800 | Headline 1d | Text
12  | 2       | 10     | 1
13  | 2       | 9      | 1
Der aktuell aufgerufene Datensatz hat die ID 6.

Select vorhergehender Datensatz:
PHP-Code:
SELECT DISTINCT d.id AS idd.topicidd.onoffd.datumcopyd.id AS copydidCOALESCE(copyd.datumd.datum) AS ddatum 
FROM datas d 
LEFT JOIN datas copyd ON copyd
.id d.copyof 
WHERE d
.topicid AND d.onoff AND ((d.datum BETWEEN 1418425200 AND 1418943600) OR (copyd.datum BETWEEN 1418425200 AND 1418943600)) AND d.id NOT IN (6) AND ((d.datum 1418770800 OR copyd.datum 1418770800) OR ((d.datum 1418770800 OR copyd.datum 1418770800) AND d.id 6)) 
ORDER BY ddatumid ASC LIMIT 1 
Select nächster Datensatz:
PHP-Code:
SELECT DISTINCT d.id AS idd.topicidd.onoffd.datumcopyd.id AS copydidCOALESCE(copyd.datumd.datum) AS ddatum 
FROM datas d 
LEFT JOIN datas copyd ON copyd
.id d.copyof 
WHERE d
.topicid AND d.onoff AND ((d.datum BETWEEN 1418425200 AND 1418943600) OR (copyd.datum BETWEEN 1418425200 AND 1418943600)) AND d.id NOT IN (6) AND ((d.datum 1418770800 OR copyd.datum 1418770800) OR ((d.datum 1418770800 OR copyd.datum 1418770800) AND d.id 6)) 
ORDER BY ddatumid DESC LIMIT 1 
Plan:
Die vor - zurück Links sollten mir die Datensätze mit den IDs 12 - 13 - 6 - 2 - 7 (in dieser Reihenfolge) liefern.

Ergebnis:
Der Link vorhergehender Datensatz klappt. Außer beim ersten Datensatz, da springt es zum zweiten - Result bei Aufruf der ID 12 sollte aber leer sein.
Der Link nächster Datensatz sprint immer zum letzten Datensatz (ID 7), egal wo ich gerade bin.


Hat jemand eine Idee? Ich arbeite übrigens mit einer SQLite DB, falls das eine Rolle spielt.
Mit Zitat antworten