2016-08-25 10 views
2

Ich speichere einige Informationen in einer MySQL-Tabelle einschließlich eines Datums ohne Zeit. Das Datumsformat ist eine Zeichenfolge, die wie folgt aussieht: "25.08.2016" (Day.Month.Year).MySQL mehrere SELECT-Anweisungen in einer Abfrage

Ich möchte die obersten 50 Datensätze aus einer Tabelle absteigend nach einer Spalte auswählen, aber ich möchte nur die Zeilen mit einem bestimmten Spalteneintrag (Datum) anzeigen.

Es ist ein Ranking-System und ich möchte inaktive Personen zu aktualisieren.

Ich würde diese drei Anfragen kombinieren müssen:

SELECT * FROM `rank` ORDER BY `rank`.`Score` DESC LIMIT 0 , 50; 
SELECT * FROM `rank` WHERE NOT (`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR `TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y')); 
UPDATE `rank` SET `inactive` = '1'; 
  1. die Top 50 Personen auswählen.
  2. Auswählen der inaktiven Personen der ersten Abfrage.
  3. Aktualisierung der Personen auf inaktiv.

Die Score ist Rang 1 und das ist, warum ich DESC brauchen, möchte ich nur unter die Top-50 Personen als inaktiv nichts markieren, unter 50 diese Menschen nicht relevant sind, deshalb habe ich keine Aussage wie diese verwenden können :

SELECT * FROM `rank` WHERE NOT (`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR `TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y')) ORDER BY `rank`.`Score` DESC LIMIT 0 , 50 

Ja, es wäre 50 Zeilen auswählen, aber nicht die Top 50.

BTW es in pHP ich tue. Und ich konnte das Problem lösen, indem sie holen:

SELECT * FROM `rank` ORDER BY `rank`.`Score` DESC LIMIT 0 , 50; 

Dann auf ein Array die accound IDs speichern, dann Abfrage:

SELECT * FROM `rank` WHERE NOT (`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR `TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y')) ORDER BY `rank`.`Score` DESC LIMIT 0 , 50; 

und vergleichen Sie die accound IDs zu dem anderen Ergebnis, wenn keine Übereinstimmung Ich habe nur die Schleife gebrochen.

Kann ich es nicht einfach mit reinem MySQL machen? Kann ich eine Sache nicht abfragen und dann die Ergebnisse filtern?

Bitte helfen Sie mir, noch Fragen?

+2

ein Datumsfeld verwenden das Leben viel einfacher machen –

+0

wird ich ein Datumsfeld verwenden würde, wenn ich in der Lage sein würde, mein bereits bestehendes Format „2016.08.25“ auf das Datumsfeld, was zu konvertieren, kann ich nicht einfach 70.000 Zeilen abschneiden .. meine Daten sind bis zu 3 Jahre alt.Wie auch immer, das ist nicht der Punkt, ich muss 50 Zeilen auswählen und dann eine einzelne Spalte vergleichen und dann die linke aktualisieren. Beispiel: Ich kaufe 50 Äpfel und 10 davon sind matschig, aber 5 davon können noch verwendet werden. – Menju

Antwort

1

Hier ist meine Antwort .

UPDATE rank AS target 
INNER JOIN (
    SELECT w.id 
    FROM rank AS w 
    INNER JOIN rank AS e ON e.id = w.id 
    WHERE (w.`TimeStamp1` = DATE_FORMAT(NOW(), '%Y-%m-%d') OR w.`TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY),'%Y-%m-%d')) 
    ORDER BY w.`Score` DESC 
    LIMIT 50 
) AS source ON source.id = target.id 
SET inactive = 1; 
+0

Vielen Dank, jetzt habe ich zwei Möglichkeiten, von denen ich lernen kann. =) – Menju

1

Eine Möglichkeit zur sequenziellen Ausführung von Abfragen besteht in der Verwendung der Transaktion. Aber das wird Ihre Abfragen nicht in eins kombinieren.

BEGIN TRANSACTION; 

SELECT * 
FROM `rank` 
ORDER BY `rank`.`Score` DESC LIMIT 0 , 50; 

SELECT * 
FROM `rank` 
WHERE NOT (`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR `TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y')); 

UPDATE `rank` SET `inactive` = '1'; 


COMMIT; 
+0

Ich habe sowas wie SELECT * FROM (AUSWAHL * FROM (AUSWAHL * FROM) als aliastwo) als aliasone gesehen. Aber ich weiß nicht, wie ich es für meine Aussagen verwenden soll. Wählen Sie 50 Äpfel -> Wählen Sie squishy Äpfel -> Aktualisieren squishy Äpfel – Menju

1

Vielleicht könnte eine Kombination der drei Abfragen sein:

update rank r 
set r.inactive = 1 
from 
(select a.account_id from rank a 
join (select account_id from rank order by rank.score desc limit 0, 50) b on (a.account_id = b.account_id) 
where (a.`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR a.`TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y'))) l 
where r.account_id = l.account_id 

Lassen Sie mich wissen, wenn etwas nicht :)

Edit: tauschte rank_id mit account_id

+0

Vielen Dank das ist es! Aber es gibt mir das entgegengesetzte Ergebnis - sorry meine schlechte .. WO NICHT (a. ... Vielen Dank! Dieses Ding ist so verwirrend, ist nicht eine Website mit einem kleinen Werkzeug, das dies für mich schafft :) – Menju

Verwandte Themen