|
Флудильня Разговоры на любые темы. Мы устаем постоянно работать. Иногда надо где-то немного отдохнуть. Пожалуйста, не надо здесь устраивать бардак. |
|
Опции темы | Поиск в этой теме | Опции просмотра |
23.10.2010, 02:14 | #1 |
Ученый
Регистрация: 07.03.2010
Сообщений: 131
Сказал(а) спасибо: 9
Поблагодарили 10 раз(а) в 10 сообщениях
|
JOIN таблиц, как написать
Как исключить из выдачи запроса SELECT * FROM `characters` персонажей на GM-аккаунтах?
|
23.10.2010, 03:05 | #2 |
Forum bot
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
|
без join-ов всяких...
Код:
SELECT * FROM `characters`.`characters` WHERE `account` NOT IN (SELECT `id` FROM `realmd`.`account` WHERE `gmlevel` !=0);
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки. |
23.10.2010, 03:25 | #3 |
Ученый
Регистрация: 07.03.2010
Сообщений: 131
Сказал(а) спасибо: 9
Поблагодарили 10 раз(а) в 10 сообщениях
|
Благодарю.
|
23.10.2010, 10:45 | #4 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
а можно и с джойнами
Код:
SELECT c.*, a.* FROM `characters`.`characters` c LEFT JOIN `realmd`.`account` a ON a.id = c.guid && a.gmlevel = 0; |
23.10.2010, 13:53 | #5 |
Администратор
|
LEFT JOIN тут не нужен вообще, обычный перекрестный запрос на выборку данных.
|
23.10.2010, 14:02 | #6 | ||
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
Цитата:
Наиболее адекватный на мой взгляд запрос: Код:
SELECT c.* FROM characters.characters c, realmd.account a WHERE c.account = a.id AND a.gmlevel = 0 LIMIT X; |
||
23.10.2010, 21:28 | #7 | |
WowCore Dev
Регистрация: 11.03.2010
Сообщений: 112
Сказал(а) спасибо: 10
Поблагодарили 51 раз(а) в 25 сообщениях
|
Цитата:
ИМХО, самым адекватным будет немного переделанный вариант того, что предложил Константин Код:
SELECT c.* FROM `realmd`.`account` a LEFT JOIN `characters`.`characters` c ON c.account = a.id where a.gmlevel = 0; Единственная неприятность, которая здесь есть - как из таблицы characters так и из таблицы account будут производится неиндексированные чтения, т.к. не задействуется ни primary key, ни secondary key(если они вообще есть). На малых массивах данных - это значения играть не будет. Но если скажем база персонажей разрастется до 1-го ляма - тогда начнут быть видны проблемы. |
|
23.10.2010, 21:37 | #8 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Какой запрос пройдет быстрее, обычный перекрестный, или тот, который предложил Константин?
|
23.10.2010, 21:41 | #9 | |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
Добавлено: правда, у меня почти полностью закеширована account.Запрос от Konctantin некорректен, неужели выше я выразился настолько неясно? |
|
23.10.2010, 21:43 | #10 |
Администратор
|
Лорд, проверь этот запрос у себя на скорость.
Код:
SELECT `characters`.* FROM `characters`.`characters`, `realmd`.`account` WHERE `characters`.`account`=`account`.`id` AND `account`.`gmlevel`=0 ORDER BY NULL; |
23.10.2010, 21:45 | #11 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Практически тоже самое, что и у Deamon-а. 93 мс против 94 мс. (может сказалось кеширование)
|
23.10.2010, 21:57 | #12 |
Администратор
|
Обязательно.
Первый раз выполняешь запрос, далее уже из кеша вызывается. Мой запрос выбирал 1425 записей из таблицы персов и одну из аккаунтов. Запрос Deamon - 1288 из таблицы персов и две из аккаунтов. Ключи и количество записей можно смотреть командой EXPLAIN перед запросом. ORDER BY NULL позволяет принудительно убрать сортировку при запросе на выборку, даже если сам запрос не содержит ORDER BY. Очень помогает при выборе большого количества данных, когда сортировка не имеет значения. EXPLAIN позволяет видеть, когда в запрос добавляется сортировка. |
23.10.2010, 23:28 | #13 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
characters не кешируется, это же живой сервер.
|
23.10.2010, 23:32 | #14 |
Ученый
Регистрация: 07.03.2010
Сообщений: 131
Сказал(а) спасибо: 9
Поблагодарили 10 раз(а) в 10 сообщениях
|
Всё, спасибо, разобрался.
|