Pregunta

Necesito un poco de ayuda. Tengo (referencia?) Tabla con columnas: id , user_id , key , value

Es más o menos una tabla de perfil de usuario y me gustaría tener SQL (estoy usando la tabla de Zend DB, pero la ayuda general de SQL funcionará) donde obtengo "todos los" usuarios de usuarios donde 'clave' es algokey y 'valor' es un valor de Ese user_id pero solo si también coincide con el lugar donde 'clave' es otro key y 'valor' es otro valor ".

En otras palabras, quiero obtener usuarios que tengan zapatos de fabricante Nike y color negro. Por lo tanto, 'Key' es Shoecolor y 'Value' es negro y también otra fila con la misma user_id tiene 'clave' es zapatero y 'valor' es nike.

Esto es lo que se me ocurrió, pero no funciona.

SELECT `user_profiles`.* FROM `user_profiles` WHERE
(`key` = 'shoecolor' AND `value` = 'BLACK') AND
(`key` = 'shoemaker' AND `value` = 'NIKE')

En caso de que alguien tenga conocimiento en Zend DB:

$where = array('shoecolor' => 'BLACK', 'shoemaker' => 'NIKE');
    foreach ($where as $key => $value) {
        $sql = $db->quoteInto('key = ?', $key);
        $sql .= ' AND ' . $db->quoteInto('value = ?', $value);
        $select->where($sql);
    }
    // make unique result
    //$select->groupBy('user_id');
    $resultSet = $zendTableInstance->fetchAll($select);

Por favor ayuda. Gracias.

¿Fue útil?

Solución

Debido a que el par de clave/valor está en la fila, su consulta está buscando una clave que sea 3 y 4. Ningún valor puede ser 3 y 4 al mismo tiempo;)

SELECT user_profiles.* FROM user_profiles WHERE (key = 3 AND value = 21) AND (key = 4 AND value = 55)

no trabajará.

¿Podrías hacerte una unión a ti mismo y verificar estos valores?

SELECT user_profiles.* 
FROM user_profiles up1
  JOIN user_profiles up2 ON up1.user_id = up2.user_id
WHERE 
  (up1.key = 3 AND up1.value = 21) 
  AND (up2.key = 4 AND up2.value = 55)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top