ФорумПрограммированиеPHP для идиотов → Профи не обосрались? вот вам и джоины!

Профи не обосрались? вот вам и джоины!

  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 2 августа 2010 г. 10:05

    возник тяжелый запрос. для меня.

    есть табл users


    user_id user_login user_pass user_name
    1 ivanscm2 3f8d2b8e5c54c6d357cd18d99ca5bedb Второй Ванько(клон)
    2 ivanscm 6dd9cae47fd35c78f34275947d73b813 Ванько


    есть game

    game_id 	game_name 	creator_id 	gamer_2 	gamer_3 	gamer_4
    1 Пробная игра :) 1 0 2 0


    как же мне извлеч в строке ид игры, найм игры, всех айдишники и имена?
    джоины курил. вкурил? может надо с переменными?

    сорь за интригующий сабж наме
    С возвращением, Пiха!
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 2 августа 2010 г. 10:14, спустя 9 минут 50 секунд

    если геймеров больше одного их нужно выносить в 3 таблицу - таблицу связей
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 2 августа 2010 г. 10:18, спустя 3 минуты 19 секунд

    Какая нахуй декартова выборка :) давай говори
    Спустя 135 сек.
    Это еще один жоин напросто и все?
    Спустя 31 сек.
    Спустя 2 минуты 15 секунд добавил
    Долго думал сцуко
    С возвращением, Пiха!
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 2 августа 2010 г. 10:28, спустя 10 минут 13 секунд


    вариант груженный
    SELECT g.*, (SELECT user_name FROM users WHERE user_id=g.creator_id) as creator_name, (SELECT user_name FROM users WHERE user_id=g.gamer_2) as gamer_name_2 FROM games g WHERE g.game_id='{$какая то игра}'

    щас придут и оторвут мне что нибудь :)
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 2 августа 2010 г. 12:49, спустя 2 часа 21 минуту 30 секунд

    создавай 3-ю таблицу
    users_games
    user_id | game_id

    SELECT g.game_id, u.user_name
    FROM games AS g
    LEFT JOIN users_games AS ug ON g.game_id = ug.game_id
    LEFT JOIN users AS u ON ug.user_id = u.user_id
    adw/0
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 3 августа 2010 г. 0:09, спустя 11 часов 19 минут 58 секунд

    сделал третий табл
    game_id 	user_id 	is_creator
    1 1 1
    1 2 0
    С возвращением, Пiха!
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 3 августа 2010 г. 3:35, спустя 3 часа 25 минут 39 секунд

    профи обобосрались :)

    $res = $db->query("
    SELECT g.game_name, g.game_id, u.user_name, u.user_id
    FROM ?t AS g
    LEFT JOIN link_game_user AS ug ON g.game_id = ug.game_id
    LEFT JOIN ?t AS u ON ug.user_id = u.user_id
    ", Array("game", "users"), "assoc");

    на основе данных сверху результат таков:
    array(4) { ["game_name"]=>  string(26) "Пробная игра :)" ["game_id"]=>  string(1) "1" ["user_name"]=>  string(35) "Второй Ванько(клон)" ["user_id"]=>  string(1) "1" }
    array(4) { ["game_name"]=> string(26) "Пробная игра :)" ["game_id"]=> string(1) "1" ["user_name"]=> string(12) "Ванько" ["user_id"]=> string(1) "2" }
    С возвращением, Пiха!
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 3 августа 2010 г. 3:53, спустя 17 минут 50 секунд

    Кста, у мну если игрок еще не присоеденился, юзер айди равен нулю
    С возвращением, Пiха!
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 5:13, спустя 1 час 20 минут 16 секунд

    профи обобосрались :)

    "обобосрали" имел ввиду?
    Я так и не понял, тебя устраивает все или что?
    adw/0
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 3 августа 2010 г. 10:02, спустя 4 часа 49 минут

    Нет Эдво, меня не устраивает :)
    С возвращением, Пiха!
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 10:25, спустя 22 минуты 57 секунд

    что тебя не устраивает в результата выборки?
    adw/0
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 3 августа 2010 г. 10:27, спустя 2 минуты 17 секунд

    записей при выводе должно быть столько сколько игр. и в той же строке имена и айдишники юзеров. массив их
    С возвращением, Пiха!
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 10:59, спустя 31 минуту 31 секунду

    почитай о group _concat()
    adw/0
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 3 августа 2010 г. 11:13, спустя 13 минут 50 секунд

    не часто встречаются такие избыточные данные, обычно имена хранят в одной таблице, животных во второй, а связи в третьей таблице.
    Вот как раз для такого случая и будет полезна GROUP_CONCAT( ).
    Приведу пример с вложенным запросом.
    SELECT DISTINCT `name` as `name1`,
    (select GROUP_CONCAT(`pet`) as `pet` from `test` where `name` = `name1` )as `pet`
    FROM `test`


    http://webi.ru/webi_articles/8_14_f.html

    а как в моем случае?
    С возвращением, Пiха!
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 11:30, спустя 17 минут 26 секунд

    а когда сам начнешь думать?
    Спустя 83 сек.

    SELECT g.game_id, GROUP_CONCAT(u.user_name) as names
    FROM games AS g
    LEFT JOIN users_games AS ug ON g.game_id = ug.game_id
    LEFT JOIN users AS u ON ug.user_id = u.user_id
    GROUP BY g.game_id
    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!