За последние 24 часа нас посетили 22814 программистов и 1234 робота. Сейчас ищет 731 программист ...

Выборка из таблицы mysql

Тема в разделе "PHP для новичков", создана пользователем Reken, 20 окт 2021.

Метки:
  1. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    Подскажите пожалуйста. У меня есть две таблицы в mysql, допустим table1 и table2.
    table1 содержит столбцы: id | name | email
    table2 содержит столбцы: id | name | status
    Важный момент, все значения в столбце name, одинаковые в обеих таблицах...

    Мне нужно, сделать выборку значений name из первой таблицы, где значение status будет равно "2"...Полученные значения записать в массив...
    Далее мне нужно из второй таблицы, вывести значения email, только для тех записей name, которые перечислены в массиве полученном из первой таблицы.

    Хочу это реализовать так:
    Через PDO из первой таблицы получить массив со значениями.
    Далее через второй запрос PDO сделать выборку нужных email при помощи полученного ранее массива и оператора IN()...
    Правильный подход? Или можно как то подругому? Например сделать всё в одном запросе PDO и на выходе сразу получить массив с нужными email...
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не совсем. name в одной из колонок лишняя. Если id есть.
    Выложите структуру обеих таблиц сюда, желательно с данными.
    Вам подскажут как их объединить в одном запросе.
     
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    PHP:
    1. SELECT `t1`.* FROM `table1` as `t1` INNER JOIN `table2` as `t2` WHERE `t1`.`status` = '2' AND `t1`.`id` = `t2`.`id`
    Получишь те строки из первой таблицы, у которых во второй такой же id и status = 2
    Вроде так должно работать, лень проверять. Но смысл такой.
    Поправьте, если не прав

    Ну а объект, полученный в результате запроса уже в
    PHP:
    1. $query->fetch_all (MYSQLI_RESULT);
    И согласен со сказанным выше, данные пользователя достаточно хранить в одной таблице, для взаимодействия между таблицами и собственно идентификации пользователя достаточно поля id. Только нужно ли тебе создавать две таблицы, в которых будет создаваться одинаковое количество строк для каждого пользователя. Почему нельзя статус поместить в первую?
     
    #3 SamyRed, 20 окт 2021
    Последнее редактирование: 20 окт 2021
  4. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    Спасибо за советы...
    У меня проект устроен так, что в нем 2 таблицы:
    Первая таблица, нужна для авторизации и регистрации, в общем содержит в себе логин,пароль и email. Выглядит так:
    id | name | password | email

    Вторая таблица, нужна для содержания в себе информации, которую пользователи ежегодно и ежемесячно вносят в проект...Выглядит примерно так:
    id | name | meaning1 | meaning2 | meaning3 | meaning4 | meaning5 | year | mounth | status
    Колонки год/месяц и статус нужны для того, что бы вывести информацию занесенную в определенный промежуток времени и посмотреть в каком она статусе...Поле name нужно для того, что бы посмотреть значения именно интересующего нас пользователя...

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

    Поэтому принял решение email вынести в таблицу, которая содержит список пользователей проекта (первая таблица)...

    Так что у меня разное количество строк в этих таблицах. В первой немного (количество пользователей). Во второй много (вся внесенная ими информация).
     
  5. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Судя по всему, вы не совсем понимаете для чего в таблице нужен id
    И теперь, когда вам поспешили дать готовое решение, вы можете и не захотеть в этом разобраться
     
    #5 Drunkenmunky, 20 окт 2021
    Последнее редактирование: 20 окт 2021
  6. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Учитывая что там разное количество строк, то по id сравнивать нельзя. Нужно поменять поле name во второй таблице на user_id, и сравнивать по нему, тк id должен быть автоинкрементом
    --- Добавлено ---
    Судя по всему, это ещё не готовое решение
     
  7. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    Готовое решение мне и не нужно было...Я спрашивал как можно ещё сделать...
    На сколько я понимаю id это уникальный признак объекта. Во второй таблице я по этим признакам (id), могу редактировать именно нужную мне строчку. Допустим пользователь Reken занес во вторую таблицу 150 строчек, у каждой свой id. Если у всех этих строчек будет одинаковый id, такой же как у Reken в таблице №1, выборка по нему в таблице №2 станет не возможна...В моем случае, у этих таблиц общее только поле name...
    Если разобраться, то правильнее наверное, Во второй таблице у всех записей занесенных пользователем Reken, сделать id такой же как в первой таблице у пользователя Reken...А уникальным сделать другой столбик, допустим "marker", по которому и находить нужную строчку...Такую же процедуру сделать со строками для каждого пользователя...Но в этом случае придется менять уже существующую таблицу, и логику проекта...
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    и что тут страшного? конечно нужно.. делать нормально все, а не абы-кабы....

    и не надо придумывать велосипеды для названия полей, чтоб потом голову ломать что и где
    id - обычно, (в абсолютном большинстве) уникальный, автоинкрементный идентификатор записи в таблице,
    если нужны связи с другими таблиыами обычно используют назваине сущности подчеркивание id, например в вашем случае это может быть user_id - который как-бы подсказывает, что тут хранится id пользователя из таблицы users,
    а еще неплохо было бы использовать внешние ключ для таких полей

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

    P.S кстати то что у вас значения meaning1 | meaning2 | meaning3 | meaning4 | meaning5 тоже наталкивает на мысль о непродуманности структуры БД, а вдруг завтра надо будет еще 10 значений передавать - и что? добавлять поля? переписывать логику?

    а ведь можно по другому.. по правильному
     
  9. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Что вы говорите!

    Бинго
    Еще думайте
     
  10. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Конкретнее, пожалуйста.

    Я не очень корректно выразился, id не должен быть автоинкрементом, а так принято, что id уникальный, и он же автоинкремент. Лично я бы сделал именно так
    --- Добавлено ---
    Можно хранить всё в одном поле в виде JSON строки
     
  11. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Опять мимо.
    Это инструмент, возможность. Как вы её использовать будете, вообще никого не волнует.
    Если оно работает. И работает быстро.
    Есть какие-то общепринятые наработки, шаблоны, хитрости.
    Основная таблица одна, вот в ней id автоинкремент и уникален.
    В связанных таблицах он может быть каким угодно. В зависимости от задачи.
    Если с головой не дружить.