Frage

Ich habe diese schreckliche Abfrage, bei der ich mit IFNULL feststelle, ob es ein Ergebnis vor und ein Ergebnis nach meiner Ergebnismenge gibt.Die Ergebnismenge wird durch einen Zeitraum bestimmt, siehe 5. Mai bis 10.Mai.Dieser Zeitraum wird in meiner Anwendung als Liniendiagramm visualisiert.Ich möchte das erste Ergebnis vor und nach dem Zeitraum vom 5. bis 10. Mai, falls vorhanden (daher die Verwendung von IFNULL), weil ich möchte, dass die Grafiklinie kontinuierlich ist.Wenn vor dem visualisierten Zeitraum ein Ergebnis liegt, muss ich damit beginnen, die Linie von diesem Punkt aus zu zeichnen und den Diagrammbereich zu schneiden, obwohl er nicht auf dem Bildschirm angezeigt wird.

Sehen Sie sich das Bild für ein visuelles Beispiel an.Das erste Diagramm enthält keine Messung vor und nach dem visualisierten Zeitraum (das Feld stellt den Bereich des Diagramms dar, der dem Benutzer tatsächlich angezeigt wird), und das zweite Diagramm schneidet die Y-Achse, da es eine Messung vor und nach dem angezeigten Zeitraum gibt eins danach.

enter image description here

Jetzt so weit so gut, meine schreckliche Abfrage funktioniert.Das heißt, wenn ich nur die Messungen einer Entität erhalten möchte.Aber jetzt möchte ich dieses Ergebnis für eine Reihe von Entitäten in einer Abfrage in Bezug auf die Leistung erhalten.Bessere einmalige Abfrage, um Messungen von 200 Entitäten zu erhalten, als Abfrage pro Entität = 200 Mal.Also dachte ich, ich ändere die Abfrage von WHERE Entity.Id=1 zu WHERE Entity.Id IN (1, 2, 3, 4).Das Problem besteht nun darin, dass der Zeitraum, in dem Messungen vor und nach dem Diagramm enthalten sind, verallgemeinert und nicht pro Entität und ihren Messungen ausgewertet wird.

Unten ist die Abfrage, die pro Entität funktioniert (in meinem speziellen Fall eine Kuh)

SELECT 
    *
FROM
    `measurements`
WHERE
    `CowId` = 23 AND `CellCount` >= 0
        AND (`Date` BETWEEN IFNULL((SELECT 
                    MAX(`Date`)
                FROM
                    `measurements`
                WHERE
                    `CowId` = 23
                        AND `Date` < '2014-03-28 00:00:00'),
            '2014-03-28 00:00:00') AND IFNULL((SELECT 
                    MIN(`Date`)
                FROM
                    `measurements`
                WHERE
                    `CowId` = 23
                        AND `Date` > '2014-04-11 23:59:59'),
            '2014-04-11 23:59:59'))
ORDER BY `CowId` ASC , `Date` ASC

Und hier ist mein Versuch, alle Kühe und ihre Maße in einer Abfrage abzufragen

SELECT 
    *
FROM
    `measurements`
WHERE
    `CowId` IN (23 , 22, 19, 18, 17, 16, 15, 20, 21, 14)
        AND `CellCount` >= 0
        AND (`Date` BETWEEN IFNULL((SELECT 
                    MAX(`Date`)
                FROM
                    `measurements`
                WHERE
                    `CowId` IN (23 , 22, 19, 18, 17, 16, 15, 20, 21, 14)
                        AND `Date` < '2014-03-28 00:00:00'),
            '2014-03-28 00:00:00') AND IFNULL((SELECT 
                    MIN(`Date`)
                FROM
                    `measurements`
                WHERE
                    `CowId` IN (23 , 22, 19, 18, 17, 16, 15, 20, 21, 14)
                        AND `Date` > '2014-04-11 23:59:59'),
            '2014-04-11 23:59:59'))
ORDER BY `CowId` ASC , `Date` ASC

Oh Hirsch, was für eine schrecklich aussehende Frage, die ich hier auf SO gepostet habe.Hoffentlich habe ich mich klar ausgedrückt.Danke!

War es hilfreich?

Lösung

In dortigen Unterabfragen sollte in der Hauptabfrage eine Verbindung zu CowID bestehen...Ihre Anfrage sollte so aussehen:

SELECT 
    *
FROM
  `measurements` `m1`
  WHERE
      `m1`.`CowId` IN (23 , 22, 19, 18, 17, 16, 15, 20, 21, 14)
    AND `m1`.`CellCount` >= 0
    AND (`m1`.`Date` BETWEEN IFNULL((SELECT 
                MAX( `m2`.`Date`)
            FROM
                `measurements` `m2`
            WHERE
               `m2`.`CowId` =  `m1`.`CowId`
                    AND `m2`.`Date` < '2014-03-28 00:00:00'),
        '2014-03-28 00:00:00') AND IFNULL((SELECT 
                MIN( `m3`.`Date`)
            FROM
                `measurements` `m3`
            WHERE
                `m3`.`CowId` =  `m1`.`CowId`
                    AND  `m3`.`Date` > '2014-04-11 23:59:59'),
        '2014-04-11 23:59:59'))
  ORDER BY  `m1`.`CowId` ASC ,`m1`.`Date` ASC
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top