2012-04-04 9 views
25

Tengo una tabla que tiene múltiples filas con los siguientes campos:instrucción SQL mediante la cláusula Donde con múltiples valores

PersonName SongName Status 

quiero usar nombres seleccionados de un cuadro de lista de selección múltiple, que puedo recuperar los valores, y luego haga una cláusula Where para que muestre los nombres de las canciones que las personas seleccionadas pueden reproducir, por lo tanto, el estado está completo.

Por ejemplo:

PersonName  SongName Status 
Holly   Highland Complete 
Holly   Mech  Complete 
Ryan   Highland Complete 

Si selecciono Holly y Ryan desde el cuadro de lista y pulse el botón de la consulta debería mostrar la montaña ya que es lo que ambos conocen.

+0

Si 'Ryan' No tiene' complete' como el estado, el resultado debería ser 'Highland'? –

+0

SELECCIONE [SongName] FROM [Aprendizaje] WHERE ([BandieName] LIKE '%' + '"& item.Text &"' + '%') AND ([BandieName] LIKE '%' + '"& item.Text & "'+'% ') AND ([Estado] ME GUSTA' Completo ') – Sophie

Respuesta

48

Prueba esto:

select songName from t 
where personName in ('Ryan', 'Holly') 
group by songName 
having count(distinct personName) = 2 

El número en el que tiene debe coincidir con la cantidad de personas. Si también necesita el Estado para ser Complete uso de este where cláusula en lugar de la anterior:

where personName in ('Ryan', 'Holly') and status = 'Complete' 
+0

Esto no trae ningún resultado, esto es similar a lo que estaba trabajando antes, si lo usaste o te gusta 'holly' AND 'RYAN 'Entonces no trae resultados, si usas O en lugar de Y, aparecerá todas esas canciones que tienen un estado de completo para holly y ryan, no solo para las que tanto holly como ryan han completado. gracias – Sophie

+1

Eso no es posible, como puede ver, proporciona el resultado esperado [aquí] (http://sqlfiddle.com/#!2/e1783/2) con los mismos datos que ha proporcionado. –

+0

por lo que esta consulta se ejecutó y le proporcionó el resultado esperado, por lo tanto, se ejecutó correctamente? – Sophie

6
SELECT PersonName, songName, status 
FROM table 
WHERE name IN ('Holly', 'Ryan') 

Si está utilizando el procedimiento almacenado parametrizado:

  1. pase en coma separó cadena
  2. Uso función especial para dividir separados por comas cadena en valor de tabla de variables
  3. Uso INNER JOIN ON t.PersonName = newTable.PersonName utilizando una variable de tabla que contiene los nombres pasados ​​en
+0

El nombre debe ser un alias de la columna PersonName. –

+0

@aF. Puedes ver por qué estarías confundido: ¡los datos de muestra muestran diferentes nombres de columna a las definiciones mencionadas anteriormente! – Bridge

+0

@Bridge la pregunta fue editada oO –

0
Select t1.SongName 
From tablename t1 
left join tablename t2 
on t1.SongName = t2.SongName 
    and t1.PersonName <> t2.PersonName 
    and t1.Status = 'Complete' -- my assumption that this is necessary 
    and t2.Status = 'Complete' -- my assumption that this is necessary 
    and t1.PersonName IN ('Holly', 'Ryan') 
    and t2.PersonName IN ('Holly', 'Ryan') 
+0

¿Ambos están en la misma mesa? – Sophie

+0

@Sophie Sí, esto es una auto-unión. –

+0

mi tabla se llama Aprender cuál sería el equivalente para t1 y t2? – Sophie

Cuestiones relacionadas