Уважаемые форумчане! помогите с запросом. Есть три таблицы: - a id_man man 1 Вася 2 Петя 3 Коля - в id_book book 1 Война и Мир 2 Идиот 3 Ревизор 4 Преступление и наказание - c (таблица связей) id_man id_book 1 3 1 4 2 1 2 3 3 2 3 3 3 4 Вопрос: как, имея имя (например, Петя), выбрать все книги, которых у него нет? как выбрать все книги, которые у него есть - пожалуйста, а в этом случае, почему то туплю Заранее спасибо за помощь
PHP: 'SELECT b.book FROM a, b, c WHERE b.id_book != c.id_book AND c.id_man = a.id_man AND a.man= "' . $man . '"' Конечно же это не правильно. JOIN не использовал. , если честно
Чот я подумал... Тут можно и без джойна но с подзапросом: выбрать все книги, где айди книги не в (выбрать все связи.айди-книги из связи, пользователи где связь.пользователь равно пользователь.айди и пользователь имя равно ДОЛЛАР-ИМЯ) Подзапрос можно не умножением а джойном. Всё вместе можно без подзапроса а с джойном. Но тебе пока кажется проще будет с подзапросом.
PHP: 'SELECT b.book FROM b WHERE b.id_book NOT IN (SELECT c.id_book FROM a, c WHERE c.id_man = a.id_man AND a.man = "' . $man. '")' Спасибо. все работает. Вопрос, хочется сразу же научиться делать оптимальные (правильные запросы). Подскажите или направьте, как будет лучше? я так понимаю подзапрос - это дополнительное обращение к БД и, соответственно, лишняя нагрузка. join я так понимаю позволит сделать выборку в рамках одного запроса. Пока что не очень силен в них
не совсем так. Вот когда ты стреляешь себе в ногу выбирая все данные в пых и обрабатывая на стороне пыха, в цикле делая запросы за недостающими связями - тогда ты нагружаешь базу. А когда ты делаешь комплексные запросы - собственный оптимизатор СУБД старается построить результирующую таблицу наиболее оптимальным планом. Можешь сделать EXPLAIN и посмотреть что думает СУБД по твой запрос со вложенным запросом. Там же кстати и увидишь используются ли у тебя индексы.
сделал я EXPLAIN в phpmyadmin . еще в крайней степени слабоват и поэтому ничего в полученной таблице не увидел к сожалению)))
не понял твоего вопроса. У тебя все запросы к данным работают с кортежами. Запросы обновления и удаления "начинаются" примерно так же как и запросы выборки этих же кортежей, поэтому ты можешь сделать селект-запрос чтоб увидеть какие объекты в результирующей таблице (в случае выборки - вернутся, в случае обновления - обновятся, при удалении - удалятся. Ваш Кэп.). А если дописать ключевое слово explain перед этим селект-запросом то можно увидеть в каком порядке и с использованием каких ключей субд собирала результирующую таблицу, использовался ли горячий кэш или пришлось перечитывать данные с диска, использовались ли временные таблицы, и тд. Полезная штука, помогающая ещё и правильно разрабатывать структуру бд.
Ты сам-то материал по джоинам изучил? Попробовал? Мне понравилось как ты вчера не включил халявщика, не стал просить готовый код, а просто транслировал моё сообщение в лексемы языка структурированных запросов. Да, моя заслуга в этом тоже есть - я дал почти готовый запрос, просто русскими словами. Давай ты с джойнами пару-тройку вариантов пришлёшь чтоб я не просто так давал тебе готовый код.
PHP: SELECT db_a.user, db_a.date_reg, FROM db_a, db_b WHERE db_a.id = db_b.id Ну или JOIN (особенно когда из трех таблиц)
@glorsh66 напрямую зависит от архитектуры бд и конфигурации сервера. В разных случаях могут быть разные результаты.
Спрошу тогда еще один вопрос - он близко по теме - как тестировать скорость выполнения запросов? Например я хочу протестировать время выполнения (и нагрузку) трех подходов 1) отдельные запросы по очереди 2) join 3) вложенные запросы Какой инструментарий использовать что бы получить наибоее точные резульаты? (ну понятно что лучше всего сделать миллион записей для теста).
explain подскажет тебе некоторые полезные данные. тестировать синтетически можно просто сделать функцию тестирования вокруг которой замерить время её выполнения. и в цикле её несколько раз вызывать для более точного среднего значения.