Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL select mit bedingter Logik

SELECT days.meta_value
FROM tableName AS from_country,
     tableName AS to_country,
     tableName AS days
WHERE from_country.item_id = to_country.item_id
  AND from_country.item_id = days.item_id
  AND from_country.field_id = 90
  AND to_country.field_id = 93
  AND days.field_id = 251

Sie können weitere Einschränkungen hinzufügen, wenn Sie nach from_country.meta_value filtern möchten oder ähnliches. Und Sie sollten tableName ersetzen mit dem tatsächlichen Namen der Tabelle.

Denken Sie an from_country , to_country und days als drei verschiedene Zeiger auf Zeilen in Ihrer Tabelle oder alternativ verschiedene Variablen, die Werte aus Ihrer Beziehung übernehmen. Sie möchten, dass alle drei denselben Artikel beschreiben, und Sie möchten außerdem, dass sich jeder auf das mit seinem Namen verknüpfte Feld bezieht. Daraus ergeben sich die oben genannten Bedingungen.

Sie könnten sogar eine Ansicht erstellen, um auf diese schlecht gestaltete Tabelle wie auf eine richtig gestaltete zuzugreifen:

CREATE VIEW viewName AS
SELECT item.item_id AS item_id,
       from_country.meta_value AS from_country,
       to_country.meta_value AS to_country,
       days.meta_value AS days
FROM (SELECT DISTINCT item_id FROM tableName) AS item
     LEFT JOIN tableName AS from_country
            ON (from_country.item_id = item.item_id AND
                from_country.field_id = 90)
     LEFT JOIN tableName AS to_country
            ON (to_country.item_id = item.item_id AND
                to_country.field_id = 93)
     LEFT JOIN tableName AS days
            ON (days.item_id = item.item_id AND
                days.field_id = 251)

Dies würde eine Ansicht mit vier Spalten erstellen, aus der Sie einfach auswählen könnten:

SELECT days FROM viewName WHERE from_country LIKE 'A%'

oder was auch immer Sie auswählen möchten. Beachten Sie, dass aufgrund der Linksverknüpfungen fehlende Werte für einige Elemente zu NULL führen Werte. Dies steht im Gegensatz zur obigen Abfrage, bei der alle Elemente ausgelassen werden, für die nicht alle drei Werte angegeben sind. Verwenden Sie, was in Ihrer Situation besser geeignet ist.