2017-12-21 2 views
-1

Ich bin auf der Suche nach einer MySql-Abfrage, die letzten 6 Monaten Update Daten OR/UND, wenn die Summe der Ergebnisse weniger als 100 ist , die nächsten n Zeilen zu vervollständigen 100.MySQL Wählen Sie letzten 6 Monat oder wenn Ergebnis summe weniger 100 die 100 zuletzt eingefügten Zeilen

Die Tabelle Abfrage erstellen:

CREATE TABLE `content` (
    `id` int(11) NOT NULL, 
    `id_cat` int(11) NOT NULL, 
    `title` text, 
    `lastUpdate` date NOT NULL, 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

ALTER TABLE `content` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `content` 
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10175; 

Der erste Teil der Abfrage ist:

SELECT * 
FROM content, 
    categories 
WHERE categories.id = content.id_cat 
    AND lastUpdate > DATE_SUB(now(), INTERVAL 6 MONTH) 
ORDER BY lastUpdate DESC, 
     content.id DESC, 
     content.title ASC 

finde ich nicht Erklärungen, dies zu tun. Jemand könnte mir helfen?

+1

'die nächsten n Zeilen 100' abzuschließen ... was ist die Logik, die bestimmt, was diese„nächsten n Zeilen“sind? –

+1

Wenn Sie die aktuelle Reihenfolge verwenden möchten, um auch die Stop-Gap-Datensätze auszuwählen (um die Summe 100 zu erhalten, falls die Abfrage weniger zurückgibt), müssen Sie nur die Prüfung 'DATE_SUB' entfernen und' hinzufügen LIMIT 100' bis zum Ende Ihrer Anfrage. –

+0

Diese Abfrage sollte die zuletzt aktualisierten Artikel zurückgeben. Aber wenn alle Artikel älter als 6 Monate aktualisiert werden, möchte ich die n (100?) Zuletzt eingefügte ID auswählen, um etwas anzuzeigen. Und wenn es in dieser Zeit nur zwei aktualisierte Artikel gibt, möchte ich die 98 zuletzt eingefügten Artikel auswählen. –

Antwort

0

Wie ich die Frage verstehe, wollen Sie alle Datensätze innerhalb der letzten 6 Monate; Wenn dieser Satz weniger als 100 Datensätze enthält, wählen Sie die obersten 100 letzten Datensätze aus.

Ein Ansatz ist wie folgt:

SELECT * 
FROM content 
INNER JOIN categories 
ON categories.id = content.id_cat 
WHERE lastUpdate > DATE_SUB(now(), INTERVAL 6 MONTH) 
OR content.id IN (SELECT content.id FROM content 
INNER JOIN categories 
ON categories.id = content.id_cat 
ORDER BY lastUpdate DESC, 
     content.id DESC, 
     content.title ASC 
LIMIT 100) 

ORDER BY lastUpdate DESC, 
     content.id DESC, 
     content.title ASC 
+0

Ich danke Ihnen, aber es scheint, dass " TOP "ist mit Mysql nicht verfügbar. Nur mit SQL Server (https://www.w3schools.com/sql/sql_top.asp). –

+0

Bearbeitet, um Abfrage so zu ändern, dass LIMIT 100 anstelle von Top verwendet wird. –

Verwandte Themen