За последние 24 часа нас посетили 22610 программистов и 1014 роботов. Сейчас ищет 721 программист ...

Составить запрос

Тема в разделе "Сделайте за меня", создана пользователем P4rzival, 2 апр 2018.

  1. P4rzival

    P4rzival Новичок

    С нами с:
    2 апр 2018
    Сообщения:
    5
    Симпатии:
    0
    Есть 3 таблицы в бд
    1)Category
    Содержит в себе поля id и name
    2)User
    Содержит в себе поля id,login и password
    3)user_category
    Содержит в себе поля user_id и category_id
    Нужен запрос который будет через get передавать id пользователя и включать его во все имеющиеся категории.
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @P4rzival, собственно запрос на вставку может выглядеть так:
    Код (Text):
    1. insert into user_category (user_id, category_id) select 1, cat.id from Category cat where exists (select id from User where id = 1)
    , где константа 1 - переданный из формы id пользователя.
    Но методом GET не стоит передавать информацию, необходимую для изменения данных в базе. Для этого есть POST
     
    P4rzival нравится это.
  3. P4rzival

    P4rzival Новичок

    С нами с:
    2 апр 2018
    Сообщения:
    5
    Симпатии:
    0
    @Sail ,если можно еще один вопрос,тогда каким образом будет выглядит запрос если нам надо вывести на каждого человека кол-во категорий в которых он состоит?
    И спасибо большое за предыдущий ответ,вы очень помогли :)
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
  5. P4rzival

    P4rzival Новичок

    С нами с:
    2 апр 2018
    Сообщения:
    5
    Симпатии:
    0
    @Sail
    Код (Text):
    1. SELECT user_categories.user_id, COUNT (user_categories.category_id)
    2. FROM user_categories
    3. left join
    4.   user user_id = category_id
    что-то такое получилось,но не работает (9
     
  6. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Во-первых, ключевое слово ON пропущено.
    Во-вторых, условие связки таблиц user_category и User - по id пользователя, а не id пользователя с одной стороны и id категории - с другой.
    В-третьих, внимательнее с названиями таблиц. В первом сообщении они другие.
    В-четвертых, ещё нужна группировка.
    На основе этого примера:
    Код (Text):
    1.  SELECT
    2.     cityname, COUNT(users.id)
    3. FROM
    4.     cities
    5.         LEFT JOIN
    6.         users ON cities.id = users.city_id AND users.age < 30
    7. GROUP BY cities.cityname
    8. ORDER BY cities.cityname;
    , из которого убрать проверку на возраст...
     
  7. P4rzival

    P4rzival Новичок

    С нами с:
    2 апр 2018
    Сообщения:
    5
    Симпатии:
    0
    @Sail извините,что до меня вся так туго доходит,но как я понял,вроде я все исправил.
    Код (Text):
    1. SELECT user_categories.user_id, COUNT (user_categories.category_id)
    2. FROM user_categories
    3. LEFT JOIN
    4. user ON user_categories.user_id = user.id
    5. GROUP BY user.id
    6. ORDER BY user.id;
     
  8. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @P4rzival, что в итоге-то? Какое сообщение выводится при попытке выполнить запрос?
    Опять обращу внимание на название таблиц: user_category и User.
     
  9. P4rzival

    P4rzival Новичок

    С нами с:
    2 апр 2018
    Сообщения:
    5
    Симпатии:
    0
    @Sail
    SELECT user_categories.user_id, COUNT (user_categories.category_id) FROM user_categories LEFT JOIN user ON user_categories.user_id = user.id GROUP BY user.id ORDER BY user.id LIMIT 0, 1000
     
  10. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @P4rzival, ещё замечание: если уж используете left join, то надо основной делать таблицу User. Иначе смысл теряется.
    Или right join, и при выводе использовать не user_id из таблицы-связки, а id из таблицы пользователей.
    Код (Text):
    1. select id, login, count(category_id) from User left join user_category on user_id = id group by id;
    2. select id, login, count(category_id) from user_category right join User on id = user_id group by user_id;
     
  11. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Вообще то от задач зависит что на что джойнить. В этом случае он правильно делает т.к. при твоём варианте будут и те юзеры у которых нет ни одной категории. А при его варике будут выбираться только те у кого есть. А вообще от первоначальной задачи товарищ далеко ушёл ( Загугли distinct и посмотри как инсерт делается со вложенной выборкой и ни какого джоина не нужно
    --- Добавлено ---
    А да, он не решив одну, еще придумывает. Тогда да, верно. Категории на юзеров джойтить, группировка по юзерам и каунт по категори айди