как сравнить 2 таблицы и создать новую таблицу и обновлять ежедневно - PullRequest
1 голос
/ 24 февраля 2020
table1

----------------|------------------|-------------------|-------------------|
|      email          |     selection1   | selection2        |     selection3
|                                                           
|---------------------|------------------|-------------------|-------------------|
|  test@test.com      |        4       |           7                     9
|---------------------|------------------|-------------------|------------------|
|test2@test.com                2                     9                6
---------------------|------------------|--------------------|-------------------|      

table2
|---------------------|------------------|-------------------|-------------------|
|      race1|                 race2      |         race3     |       race4
|                                                           
|---------------------|------------------|-------------------|-------------------|
|  5                   |        7       |           9                    2
|---------------------|------------------|-------------------|------------------|

Итак, у меня есть две таблицы. Одна основана на вводе пользователем выбора 3 гонок для номера победителя.

Вторая таблица - номер победителя гонки.

Я хочу сравнить две таблицы и создать третью. Таблица. Если выбор человека соответствует выигрышной гонке, он получает 50 очков. Таким образом, в третьей таблице будут отображаться «электронная почта» и «очки»

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

Я имею попробовал INNER JOIN, но комбинаций слишком много. Я новичок в PHP и SQL, поэтому я действительно не знаю, какой подход выбрать.

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Вы можете извлечь значения из базы данных, а затем l oop через каждого пользователя и сравнить их представления с результатами во второй таблице. Что-то вроде this должно быть в состоянии помочь вам с первой частью (извлечение данных из MySQL и в массивы).

Тогда скажем, что после извлечения их из базы данных что у вас есть массив $ users со всеми пользователями и их представлениями, а затем массив $ results с победителями для каждой расы (содержимое table2). Затем вы можете использовать для l oop или foreach для go через каждого пользователя и сравнивать каждый их выбор с результатами. Примерно так, например:

<?
//Loop through each of the users in the $users array
foreach($users as $user)
{
    if($user['selection1'] == $results['race1'])
    {
        //Add to their points or whatever you would like to do
    }

    if($user['selection2'] == $results['race2'])
    {
        //Add to their points or whatever you would like to do
    }

    if($user['selection3'] == $results['race3'])
    {
        //Add to their points or whatever you would like to do
    }
}

?>

Как бы то ни было, вы можете захотеть взглянуть на реорганизацию структуры вашей базы данных. Поскольку это не очень гибко, если вы хотите что-то изменить в будущем. Также в приведенном вами примере 3 гонки в первой таблице и 4 во второй.

1 голос
/ 24 февраля 2020

Ваша первая задача - создать подзапрос, который доставит ваш table1 в форме электронного письма, выбора. Это выглядит так (https://www.db-fiddle.com/f/mbXAqAo6Y4MPd3jH9vAY4Q/0)

             SELECT email, selection1 AS selection FROM table1
             UNION ALL
             SELECT email, selection2 AS selection FROM table1
             UNION ALL
             SELECT email, selection3 AS selection FROM table1

Далее, сделайте то же самое для вашей таблицы2. (https://www.db-fiddle.com/f/mbXAqAo6Y4MPd3jH9vAY4Q/1)

             SELECT race1 AS race from table2
             UNION ALL
             SELECT race2 AS race from table2
             UNION ALL
             SELECT race3 AS race from table2
             UNION ALL
             SELECT race4 AS race from table2;

Затем необходимо выяснить, сколько значений race соответствует каждому значению selection. Это берет агрегатную функцию. Схема вашего запроса:

   SELECT email, COUNT(race) races_chosen
     FROM selections
     JOIN races ON selections.selection = races.race
    GROUP BY email

Здесь с помощью операции JOIN вы создаете набор результатов, который показывает каждое электронное письмо вместе с выбором, который также появился в гонках. Затем вы их подсчитываете.

Фактический запрос должен использовать ваши подзапросы. Похоже на это. (https://www.db-fiddle.com/f/mbXAqAo6Y4MPd3jH9vAY4Q/2)

   SELECT email, COUNT(race) races_chosen
     FROM (
             SELECT email, selection1 AS selection FROM table1
             UNION ALL
             SELECT email, selection2 AS selection FROM table1
             UNION ALL
             SELECT email, selection3 AS selection FROM table1

          ) selections
     JOIN (
             SELECT race1 AS race from table2
             UNION ALL
             SELECT race2 AS race from table2
             UNION ALL
             SELECT race3 AS race from table2
             UNION ALL
             SELECT race4 AS race from table2
          ) AS races ON selections.selection = races.race
    GROUP BY email

Наконец, вы можете изменить строку SELECT на эту, чтобы получить свои очки. (https://www.db-fiddle.com/f/mbXAqAo6Y4MPd3jH9vAY4Q/3)

   SELECT email, COUNT(race) races_chosen, COUNT(races)*50 points

Несколько вещей, которые вы должны рассмотреть.

  1. Не создавайте еще одну таблицу, содержащую это данные результата. Вместо этого используйте запрос, чтобы сгенерировать его, когда вам это нужно. Это проще, потому что вам не нужно выяснять, что изменилось, чтобы обновить дополнительную таблицу; Вы просто генерируете результаты на лету. SQL предназначен для такого рода операций.

  2. Подзапросы, которые я вам дал, позволили вам взять ваши денормализованные таблицы и нормализовать их. Без денормализации их запрос на генерацию ваших результатов был бы гораздо более сложным. Ваши таблицы денормализованы, потому что они содержат несколько фактов в каждой строке.

Вот что я имею в виду. Ваша таблица2 использует одну строку, чтобы показать четыре разных расы. Вместо этого у вас должен быть один ряд на гонку. Тогда гораздо проще добавить еще одну расу к столу с помощью INSERT или удалить ее с помощью DELETE. Это также облегчает запрос.

Ваш table1 денормализован, потому что это способ обеспечить соблюдение вашего правила о том, что каждый адрес электронной почты может выбрать до трех рас. Это терпимое решение по разработке программного обеспечения. Но, если вы хотите позволить им добавить четвертую гонку в будущем, исправить ваше приложение становится сложнее.

0 голосов
/ 24 февраля 2020

Пожалуйста, попробуйте использовать столбец «id», который называется «auto_increment». Тогда вы сможете идентифицировать всех пользователей и т.д. c.

Я бы разработал более четкую таблицу sql, чтобы все могли ее понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...