Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

SELECT ignorando una fila

Estas en el tema de SELECT ignorando una fila en el foro de Mysql en Foros del Web. Tengo en mi tabla un campo llamado "campo1" y para ese campo tengo 3 valores: valor1 (1 fila), valor2 (4 filas), valor3 (1 fila). Las ...
  #1 (permalink)  
Antiguo 21/06/2011, 19:26
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
SELECT ignorando una fila

Tengo en mi tabla un campo llamado "campo1" y para ese campo tengo 3 valores: valor1 (1 fila), valor2 (4 filas), valor3 (1 fila). Las filas que me interesan son las 4 con valor "valor2" en el campo "campo1", y hay otro campo (buscadores) en el que cada valor es único.

campo1 - buscadores
valor2 --- google
valor2 --- yahoo
valor2 --- ixquick
valor2 --- blekko
valor1 ...
valor3 ...

Mi objetivo es seleccionar 2 filas sin importar el orden, pero excluyendo la fila de "yahoo". Añado que no siempre va a ser esa la fila a ignorar, cambiaría de forma dinámica, así que no valdría usar LIMIT.

¿Cómo podría hacer un SELECT que ignorara una fila concreta?


Espero haber sido claro en mi explicación, un saludo ^^

Última edición por Gambinoh; 21/06/2011 a las 19:32
  #2 (permalink)  
Antiguo 21/06/2011, 22:51
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: SELECT ignorando una fila

Me respondo por si le sirve a alguien...

Para hacer un select ignorando de forma "dinámica" una serie de filas, la manera que he encontrado ha sido crear un bucle que recorra el array de la consulta en cuestión, e incluir dentro del bucle el código siguiente:

Código PHP:
Ver original
  1. if ($i == 1) {
  2. $id1 = $row['id'];
  3. } elseif ($i == 2) {
  4. $id2 = $row['id'];
  5. } elseif ($i == 3) {
  6. $id3 = $row['id'];
  7. } elseif ($i == 4) {
  8. $id4 = $row['id'];
  9. }

Como la variable de control (expresión primera) del bucle for es $i, con el código anterior voy asignando los valores recorridos a las variables $idx. En mi caso el bucle for ya estaba creado y sólo se trataba de añadir eso.

Para ignorar estas filas en la consulta SQL posterior he hecho:

Cita:
$sql = "SELECT * FROM tabla WHERE id != '$id1' && id != '$id2' && id != '$id3' && id != '$id4' && campo1 = '$var1' && campo2 = '$var2' ORDER BY RAND() LIMIT 2";
Código PHP:
Ver original
  1. $query = mysqli_query($conexion, $sql);
  #3 (permalink)  
Antiguo 22/06/2011, 01:51
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 2 meses
Puntos: 89
Respuesta: SELECT ignorando una fila

¿No te vale con un simple WHERE buscadores <> "yahoo"?
  #4 (permalink)  
Antiguo 22/06/2011, 08:37
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: SELECT ignorando una fila

Cita:
Iniciado por Heimish2000 Ver Mensaje
¿No te vale con un simple WHERE buscadores <> "yahoo"?
No, porque tengo que ignorar de 1 a 4 filas, entonces necesito de 1 a 4 variables distintas que en cada iteración del bucle irán recibiendo un valor. Puede que sea un poco primitivo, pero es lo que de momento he conseguido.

Hacer lo que tu me dices es lo mismo que hacer "WHERE buscadores != 'yahoo'", en tal caso no ahorro ningún caracter.
  #5 (permalink)  
Antiguo 22/06/2011, 08:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: SELECT ignorando una fila

Cita:
Hacer lo que tu me dices es lo mismo que hacer "WHERE buscadores != 'yahoo'", en tal caso no ahorro ningún caracter.
No confundas PHP con SQL. El que no ahorres ningún caracter no implica que no sea más eficiente desde el SQL, no te olvides que las cosas funcionan diferentes.
Tener una sola condición a comparar puede tener mucha mejor performance que usar todas las que propones tú.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 22/06/2011, 11:16
Avatar de Gambinoh  
Fecha de Ingreso: diciembre-2010
Mensajes: 348
Antigüedad: 13 años, 4 meses
Puntos: 11
Respuesta: SELECT ignorando una fila

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No confundas PHP con SQL. El que no ahorres ningún caracter no implica que no sea más eficiente desde el SQL, no te olvides que las cosas funcionan diferentes.
Tener una sola condición a comparar puede tener mucha mejor performance que usar todas las que propones tú.
Sí, ¿pero cómo logro tener sólo una condición? Claro que quiero optimizarlo, pero no se me ocurre de momento una forma de recoger todos los valores bajo una misma variable...
  #7 (permalink)  
Antiguo 22/06/2011, 11:23
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 2 meses
Puntos: 89
Respuesta: SELECT ignorando una fila

Con un NOT IN
  #8 (permalink)  
Antiguo 22/06/2011, 11:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: SELECT ignorando una fila

Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE id NOT IN('$id1', '$id2', '$id3', '$id4') AND campo1 = '$var1'AND campo2 = '$var2'
  3.  
  4. FROM tabla
  5. WHERE id != '$idNoBuscado' AND campo1 = '$var1'AND campo2 = '$var2'
LIMIT 2";
Estas dos son semánticamente equivalentes, pero la performance de la segunda es siempre superior a la primera.
La ventaja de la primera es que es sencilla de crear programáticamente, porque solamente tienes que agregar las condiciones a negar separandolas por comas, y la negación puede abarcar uno o mas casos (tantos como pongas).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: fila, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:24.