Nie_yar
@Nie_yar
Начинающий программист.

Как разделить полученные запросом данные по разным формам?

У меня есть 3 таблицы.

questions
5eca93f409539218925569.png

subjects
5eca94039afc2168282715.png

answers
5eca9412d6023353530384.png
Данным запросом
SELECT questions.question_text, answers.answer_1, answers.answer_2, answers.answer_3, answers.answer_4 FROM questions  JOIN answers ON answers.ID = questions.ID_answer
я вывожу вопросы и ответы.
Вопрос: как мне разделить данные вопросы и ответы в зависимости от subject_title? И в случае если subject_title имеет одно и тоже значение, то полученные данные должны быть объединены

Сейчас покажу наглядно.
Здесь я выбираю один из вариантов.
5eca96d56d175002148286.png
Мне открывается следующая форма, где показаны все данные, которые я получил запросом, а мне необходимо, чтобы данные соответствовали выбранному варианту (subject_title и subject_name), то есть, если я выбрал "Русский язык" "Пунктуация", то должны быть отображены два вопроса и ответы про "точку" и "запятую".
5eca96fc371a4205370743.png

Вот все коды, которые могут понадобиться для понимания всей ситуации.
ListItemTest
namespace WindowsFormsApp1
{
    public partial class ListItemTest : UserControl
    {
        public ListItemTest()
        {
            InitializeComponent();
        }

        #region Proporties
        private string _question;
        private string _answer1;
        private string _answer2;
        private string _answer3;
        private string _answer4;


        [Category("Custom Props")]
        public string Question
        {
            get { return _question; }
            set { _question = value; lbl_question.Text = value; }
        }

        [Category("Custom Props")]
        public string Answer1
        {
            get { return _answer1; }
            set { _answer1 = value; rb_answer1.Text = value; }
        }

        [Category("Custom Props")]
        public string Answer2
        {
            get { return _answer2; }
            set { _answer2 = value; rb_answer2.Text = value; }
        }

        [Category("Custom Props")]
        public string Answer3
        {
            get { return _answer3; }
            set { _answer3 = value; rb_answer3.Text = value; }
        }

        [Category("Custom Props")]
        public string Answer4
        {
            get { return _answer4; }
            set { _answer4 = value; rb_answer4.Text = value; }
        }
        #endregion

    }
}

5eca98ec94b28388708455.png

private void LastNumber()
        {

            string connStr = "server=localhost; port=3306; username=root; password= root; database=vedar_bd";
            string sql = "SELECT COUNT(DISTINCT question_text) FROM questions";
           // string sql = "SELECT * FROM Table WHERE Field IN (SELECT Field FROM Table GROUP BY Field HAVING COUNT(*) > 1)";
            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();

            MySqlCommand command = new MySqlCommand(sql, conn);

            string number = command.ExecuteScalar().ToString();

            int xnumber = int.Parse(number);
            SubjNumber = xnumber;
        }

        private void OneTest()
        {
            string connStr = "server=localhost; port=3306; username=root; password= root; database=vedar_bd";
            string sql = "SELECT questions.question_text, answers.answer_1, answers.answer_2, answers.answer_3, answers.answer_4 " +
                "FROM questions  JOIN answers ON answers.ID = questions.ID_answer"; 

            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();

            MySqlCommand command = new MySqlCommand(sql, conn);

            MySqlDataReader SomeTest;

            DataTable tableTest = new DataTable();

            SomeTest = command.ExecuteReader();
            tableTest.Load(SomeTest);

            ListItemTest[] listitems = new ListItemTest[SubjNumber];
            for (int i = 0; i < SubjNumber; i++)
            {
                listitems[i] = new ListItemTest();
                listitems[i].Question = tableTest.Rows[i][0].ToString();
                listitems[i].Answer1 = tableTest.Rows[i][1].ToString();
                listitems[i].Answer2 = tableTest.Rows[i][2].ToString();
                listitems[i].Answer3 = tableTest.Rows[i][3].ToString();
                listitems[i].Answer4 = tableTest.Rows[i][4].ToString();           

                if (flowLayoutPanel1.Controls.Count < 0)
                {
                    flowLayoutPanel1.Controls.Clear();
                }
                else
                    flowLayoutPanel1.Controls.Add(listitems[i]);
            }
            conn.Close();
        }

        private void Frm_TestView_Load(object sender, EventArgs e)
        {
            LastNumber();
            OneTest();
        }
  • Вопрос задан
  • 102 просмотра
Решения вопроса 2
mindtester
@mindtester Куратор тега C#
учу учиться.. чаще на C#. но бывают и варианты..
Как разделить полученные запросом данные по разным формам?
а не надо делить
надо делать адекватные запросы под каждую форму

ps но для оптимизации можно использовать временные таблицы или view
но это когда хорошо разберетесь

pps
вы можете сделать какой то запрос к БД, и получить набор данных в памяти. Array/List/IEnumerable/Dictionary
и делить уже этот набор. upd допустим средствами LINQ

хотя это просто альтернатива временным таблицам или view. в любом случае вам все таки надо понять что и в какой момент времени происходит. а для этого надо двигаться от простых схем данных/логики/предсталения, к более сложным, чуть помедленнее
Ответ написан
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
сделать джоин субъектов и выбирать по вэа субжект.ид=субжектид или квесчн.ид_субжект=субжектид

А можно подробнее?
Можно, но разбор такого кода займет много времени,
1)
SELECT COUNT(DISTINCT question_text) FROM questions
Абсолютно бесполезный дистинкт, так как у вас все записи уникальные (в теории), или отличаются вариантами ответов и тогда это разные записи, то есть ОЧЕНЬ ДОРОГАЯ операция у вас там просто прелеплена нашару.
2) для ВСЕХ операций с бд предпочтительнее использовать int поля нежели текстовые.
3)
мне необходимо, чтобы данные соответствовали выбранному варианту (subject_title и subject_name),
На самом деле нужно чтобы совпадал subjects.id (он потому и уникальный идентификатор!), который и надо передавать для выборки, а не какой-то subject_title или subject_name.
4) в запрос для этого соответственно нужно добавить джоин субжектс, выбрать нужный subjects.id, который передали по клику, и тогда разделять ничего не придется, в выборке будут только поля, относящиеся к нужному субжекту.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы