[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как сформировать сложный запрос?
Страницы: 1, 2
Dimaz
Еще вопрос. Как получить answer2, т.е. ответы другого человека, чтобы они относились к определенному тесту, как в answer_id. А то он выводит два раза 111, хотя запись в таблице всего одна. И еще, второй записи может вообще не существовать, если второй человек не прошел тест. Можно в этом случае сделать, чтобы он возвращал 0 например?
answer_id | name_test | answer_2
010 | Первый тест | 111
011 | Второй тест | 111
neadekvat
DISTINCT базой тоже превращается в GROUP BY.
Не будем забывать про читабельность в sql-запросах. То есть, начнем хотя бы с этого.
Выделяем логически основную таблицу, и к ней начинаем подключать дополнительные. Таким образом вы явно показываете, какие прослеживаются зависимости.
А хватать во from несколько таблиц - это вводить в заблуждение, будто эти таблицы имеют одинаковую значимость.
Dimaz
answer_id | name_test | answer_2
010 | Первый тест | 111
011 | Второй тест | 0
Первый человек прошел 2 теста, а второй прошел только один, то бишь Первый тест, Второй тест еще не прошел. Нужно сделать, чтобы он записал во Втором тесте 0. Подскажите пожалуйста как это сделать.
neadekvat
Dimaz, используй WHERE IN(id1, id2..) для пользователей.
А если записи могут не существовать, то возьми ту таблицу, в которой записи точно будут существовать, и цепляй таблицу через LEFT JOIN, тогда, в случаи отсутствия записей, тебе вернутся поля со значением NULL

Это кстати еще один плюс join'ов - вы явно указываете, по какому принципу связываются таблицы.
Invis1ble
Ok, аргумент с читабельностью принят smile.gif

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Dimaz
Не получается все равно так как надо. Сделал так:
SELECT `cabinet`.`name_test`, `answers`.`answer_id`, (
SELECT `answer_id` FROM `answers` WHERE `user_id` = '353281'
) as answer_2 FROM `cabinet` LEFT JOIN `answers`
ON `user_id` = '184918649' AND `friend_id` = '353281'
AND answers.test_id = cabinet.test_id

Выдает такую результирующую таблицу:
user posted image
Но мне нужно в answer_2 во второй строке получить NULL, так как второй человек прошел только тест с id 1, а с id 0 еще не прошел.
Dimaz
Наконец-то я сделал то, что хотел. Никаких LEFT JOIN не надо было. Все что было нужно это прописать в круглых скобках для answer_2, то же условие, что и для answer_id, т.е. `answers`.`test_id` = `cabinet`.`test_id`. Но мне кажется, что этот запрос можно записать короче, чтобы не писать второй раз одно и то же условие. Не подскажете как?
SELECT `cabinet`.`name_test`, `answers`.`answer_id`, (
SELECT `answer_id` FROM `answers` WHERE `user_id` = '353281' AND `answers`.`test_id` = `cabinet`.`test_id`
) as answer_2 FROM `cabinet` INNER JOIN `answers`
WHERE `user_id` = '184918649' AND `friend_id` = '353281' AND `answers`.`test_id` = `cabinet`.`test_id`

Так теперь выглядит результирующая таблица. То, что я и хотел:
user posted image
Dimaz
Помогите, пожалуйста. Уже лучше, но не совсем то, что я хотел:
SELECT `cabinet`.`name_test`, `answers`.`answer_id`
FROM `cabinet` INNER JOIN `answers`
ON `answers`.`test_id` = `cabinet`.`test_id`
WHERE `user_id` = '184918649' AND `friend_id` = '353281' OR `user_id` = '353281'

Результирующая таблица теперь такая:
user posted image
А мне нужно так:
user posted image
В предыдущем сообщении выводит так как нужно. Но я не хочу, чтобы он обращался два раза к таблице. Этот запрос `answers`.`test_id` = `cabinet`.`test_id` он выполняет 2 раза. Но так как для первого и второго пользователя test_id одинаковые, не вижу смысла искать 2 раза. Достаточно найти один раз и применить к обоим пользователям.
Гость_AlexG
Доброго времени суток!
Помогите пожалуйста сделать запрос, который выводил бы промежуток строк, заданный пользователем.
У меня получилось что-то типа этого, но выдает Resource id #5
 $sql=mysql_query( "SELECT * FROM `Rashody` WHERE 'DataSeg' <= $DataFrom AND 'DataSeg' >= $DataUntil");

$DataFrom и $DataUntil тот самый промежуток, заданный пользователем
Гость_AlexG
Сократил его до
SELECT * FROM `Rashody` WHERE `DataSeg` BETWEEN '2012-12-27' AND '2012-12-29'

Через phpmyadmin работает
через php тоже сообщение
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.