Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mysql select com lógica condicional

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

Você pode adicionar mais restrições se quiser filtrar por from_country.meta_value ou similar. E você deve substituir tableName com o nome real da tabela.

Pense em from_country , to_country e days como três ponteiros diferentes para linhas em sua tabela ou, alternativamente, variáveis ​​diferentes recebendo valores de sua relação. Você deseja que todos os três descrevam o mesmo item e também deseja que cada um deles se refira ao campo associado ao seu nome. Isso resulta nas condições indicadas acima.

Você pode até criar uma visão, para acessar essa tabela mal projetada como uma projetada corretamente:
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)

Isso criaria uma exibição com quatro colunas, das quais você poderia simplesmente selecionar:
SELECT days FROM viewName WHERE from_country LIKE 'A%'

ou o que você deseja selecionar. Observe que, devido às associações à esquerda, os valores ausentes para alguns itens resultarão em NULL valores. Isso contrasta com a consulta acima, que omitirá qualquer item que não tenha todos os três valores especificados. Use o que for mais apropriado em sua situação.