Проще говоря, я пытаюсь фильтровать базу данных в соответствии с несколькими выборами пользователя. Выбор производится с помощью элемента checkboxlist. Таблица выглядит так:
Цель состоит в том, чтобы пользователь щелкнул один или несколько "Eis", которые затем проверили базу данных (точнее, таблицу "Eisen"), чтобы узнать, в какой из "Systeem" есть ВСЕ. Проблема, которая возникает у меня, возникает, когда выбрано более одного "Eis". Это связано с тем, что я не знаю, как правильно построить следующий запрос:
SELECT DISTINCT Systeem
FROM Eisen
WHERE Eis = {first value from the checkboxlist} AND Eis = {second value from the checkboxlist}
Это, конечно, ищет отдельные строки, которые соответствуют значениям для Eis, которые никогда не подходят ни к чему. Код, который делает это, выглядит следующим образом:
string conString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
string query = "SELECT DISTINCT Systeem FROM Eisen";
string condition = string.Empty;
foreach (ListItem item in CheckBoxList1.Items)
{
condition += item.Selected ? string.Format("Eis = '{0}' AND ", item.Value) : "";
}
if (!string.IsNullOrEmpty(condition))
{
condition = string.Format(" where ({0})", condition.Substring(0, condition.Length - 5));
}
SqlCommand cmd = new SqlCommand(query + condition);
using (SqlConnection con = new SqlConnection(conString))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataSet ds = new DataSet())
{
sda.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
}
Мой вопрос следующий. Как создать запрос, чтобы он искал общие вхождения в столбце "Systeem" и проверял, какие из них имеют требуемые значения в столбце "Eis"?
Ну вот:
SELECT Systeem, count(*)
FROM dbo.Eisen
WHERE Eis IN (1)
GROUP BY Systeem
HAVING count(*) = 1
SELECT Systeem, count(*)
FROM dbo.Eisen
WHERE Eis IN (1, 2)
GROUP BY Systeem
HAVING count(*) = 2
SELECT Systeem, count(*)
FROM dbo.Eisen
WHERE Eis IN (2, 3)
GROUP BY Systeem
HAVING count(*) = 2
Обратите внимание, что ваш третий результат в вашей таблице Google неверен, если я не читаю его неправильно. Должна ли система содержать все выбранные элементы или только выбранные элементы?
Изменение: согласно комментариям, вот еще один сценарий:
SELECT Systeem, count(*)
FROM dbo.Eisen
WHERE Eis IN (2, 3)
GROUP BY Systeem
ORDER BY count(*) DESC
создайте свой запрос с помощью GROUP BY вместо DISTINCT следующим образом:
SELECT
Systeem
FROM
Eisen
WHERE
Eis = {first value from the checkboxlist}
OR Eis = {second value from the checkboxlist}
GROUP BY
Systeem
HAVING
COUNT(*) = { number of checked checkboxes }