sql >> Database >  >> RDS >> Mysql

Mysql selecteren met voorwaardelijke logica

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

U kunt meer beperkingen toevoegen als u wilt filteren op from_country.meta_value of vergelijkbaar. En je zou tableName moeten vervangen met de werkelijke naam van de tafel.

Denk aan from_country , to_country en days als drie verschillende verwijzingen naar rijen in uw tabel, of als alternatief verschillende variabelen die waarden uit uw relatie halen. U wilt dat ze alle drie hetzelfde item beschrijven, en u wilt ook dat ze allemaal verwijzen naar het veld dat bij de naam hoort. Dit resulteert in de bovenstaande voorwaarden.

U kunt zelfs een weergave maken om toegang te krijgen tot deze slecht ontworpen tabel als een goed ontworpen tabel:

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)

Dit zou een weergave met vier kolommen creëren, waaruit u eenvoudig het volgende kunt selecteren:

SELECT days FROM viewName WHERE from_country LIKE 'A%'

of wat je maar wilt selecteren. Merk op dat als gevolg van de linker joins, ontbrekende waarden voor sommige items resulteren in NULL waarden. Dit is in tegenstelling tot de bovenstaande query, waarbij elk item wordt weggelaten waarvoor niet alle drie de waarden zijn opgegeven. Gebruik wat het meest geschikt is in uw situatie.




  1. MySQL-rij 30153 is afgebroken door een GROUP_CONCAT()-fout

  2. Tabelrelatie voor subtypen

  3. PostgreSQL accepteert geen kolomalias in WHERE-clausule

  4. COUNT() versus COUNT_BIG() in SQL Server:wat is het verschil?