Еще вопрос. Как получить answer2, т.е. ответы другого человека, чтобы они относились к определенному тесту, как в answer_id. А то он выводит два раза 111, хотя запись в таблице всего одна. И еще, второй записи может вообще не существовать, если второй человек не прошел тест. Можно в этом случае сделать, чтобы он возвращал 0 например?
answer_id | name_test | answer_2
010 | Первый тест | 111
011 | Второй тест | 111
neadekvat
21.12.2012 - 00:53
DISTINCT базой тоже превращается в GROUP BY.
Не будем забывать про читабельность в sql-запросах. То есть, начнем хотя бы с этого.
Выделяем логически основную таблицу, и к ней начинаем подключать дополнительные. Таким образом вы явно показываете, какие прослеживаются зависимости.
А хватать во from несколько таблиц - это вводить в заблуждение, будто эти таблицы имеют одинаковую значимость.
answer_id | name_test | answer_2
010 | Первый тест | 111
011 | Второй тест | 0
Первый человек прошел 2 теста, а второй прошел только один, то бишь Первый тест, Второй тест еще не прошел. Нужно сделать, чтобы он записал во Втором тесте 0. Подскажите пожалуйста как это сделать.
neadekvat
21.12.2012 - 00:54
Dimaz, используй WHERE IN(id1, id2..) для пользователей.
А если записи могут не существовать, то возьми ту таблицу, в которой записи точно будут существовать, и цепляй таблицу через LEFT JOIN, тогда, в случаи отсутствия записей, тебе вернутся поля со значением NULL
Это кстати еще один плюс join'ов - вы явно указываете, по какому принципу связываются таблицы.
Invis1ble
21.12.2012 - 00:57
Не получается все равно так как надо. Сделал так:
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
Выдает такую результирующую таблицу:
Но мне нужно в answer_2 во второй строке получить NULL, так как второй человек прошел только тест с id 1, а с id 0 еще не прошел.
Наконец-то я сделал то, что хотел. Никаких 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`
Так теперь выглядит результирующая таблица. То, что я и хотел:
Помогите, пожалуйста. Уже лучше, но не совсем то, что я хотел:
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'
Результирующая таблица теперь такая:
А мне нужно так:
В предыдущем сообщении выводит так как нужно. Но я не хочу, чтобы он обращался два раза к таблице. Этот запрос `answers`.`test_id` = `cabinet`.`test_id` он выполняет 2 раза. Но так как для первого и второго пользователя test_id одинаковые, не вижу смысла искать 2 раза. Достаточно найти один раз и применить к обоим пользователям.
Гость_AlexG
27.12.2012 - 01:09
Доброго времени суток!
Помогите пожалуйста сделать запрос, который выводил бы промежуток строк, заданный пользователем.
У меня получилось что-то типа этого, но выдает Resource id #5
$sql=mysql_query( "SELECT * FROM `Rashody` WHERE 'DataSeg' <= $DataFrom AND 'DataSeg' >= $DataUntil");
$DataFrom и $DataUntil тот самый промежуток, заданный пользователем
Гость_AlexG
27.12.2012 - 01:45
Сократил его до
SELECT * FROM `Rashody` WHERE `DataSeg` BETWEEN '2012-12-27' AND '2012-12-29'
Через phpmyadmin работает
через php тоже сообщение
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.