Mysql
 sql >> Database >  >> RDS >> Mysql

Costruisci query MySQL (tabella meta_key/meta_value)

Mi piace avvicinarmi a questi usando group by e having :

select id
from t
where (meta_key = 'color' and meta_value = 'red') or
      (meta_key = 'price' and meta_value = '10')
group by id
having count(distinct meta_key) = 2;

Un'alternativa è un join . Se non ci sono valori duplicati per un id :

select id
from t tc join
     t tp
     on tc.id = tp.id and
        tc.meta_key = 'color' and tc.meta_value = 'red' and
        tp.meta_key = 'price' and tp.meta_value = '10';

Il group by metodo ha il vantaggio di scalabilità ed esprimibilità. È facile esprimere molte condizioni (il colore non è rosso, prodotto negli Stati Uniti o in Cina) che non sono una semplice uguaglianza. Inoltre, condizioni aggiuntive hanno prestazioni molto simili.

Il secondo probabilmente si comporta meglio (con gli indici giusti) in un paio di condizioni.