Фильтрация базы данных с помощью нескольких переменных

#c# #asp.net #database

#c# #asp.net #База данных

Вопрос:

Проще говоря, я пытаюсь отфильтровать базу данных в соответствии с несколькими вариантами выбора пользователем. Выбор производится с помощью элемента управления checkboxlist. Таблица выглядит следующим образом:

Таблица

Цель состоит в том, чтобы пользователь щелкнул один или несколько «Eis», который затем проверит базу данных (точнее, таблицу «Eisen»), чтобы увидеть, какая «Система» содержит их ВСЕ. Проблема, с которой я сталкиваюсь, возникает, когда выбрано более одного «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’?

Ответ №1:

Вот так:

 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
  

Комментарии:

1. Похоже, это имеет тот же эффект, что и замена AND на OR . Он возвращает списки системных вхождений, в которых есть все или некоторые из выбранных Ei.

2. Теперь я понимаю, и это вредит моему мозгу. Позвольте мне взглянуть и попробовать еще раз, обновит ответ.

3. Хорошо, вам придется группировать, а не различать, а затем получить количество строк и сопоставить его с количеством выборок. Сейчас работаем над запросом.

4. Нет проблем, это помогает мне очистить свой разум, когда я сам застреваю на работе над своими собственными проблемами.

5. В качестве дополнительной проблемы, как бы вы хотели показать все записи Systeem, но упорядочить их по количеству значений Eis, которым они соответствуют (по убыванию)? Итак, в документе Google, если я нажму 2 и 3, системные значения будут упорядочены как A-C-B, поскольку они соответствуют 2-2-1 соответственно.

Ответ №2:

создайте свой запрос с помощью 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 }