![]() |
|
Модераторы: skyboy |
![]()
|
|
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Как осуществить случайный вывод N-го количества записей из 2-х таблиц при условии, что полученные значения не должны повторяться?
Или это одним SQL-запросом не обойтись? Простой запрос выглядит так
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Dremlin |
|
|||
|
Quo vadis? ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 21.9.2006 Где: Киев Репутация: нет Всего: 4 |
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются... |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
в зависимости от специфики задачи(например, если N<< count(*)), можно использовать RAND() в секции WHERE - не будет ни temporary, ни filesort. Работать будет быстрее на порядок. Но, естественно, теоретически возможна ситуация, когда будет выбрано менее N записей...
Добавлено @ 18:47 хм... сказал глупость. ведь при использовании rand() в WHERE будет фулскан. А при использовании в ORDER BY - оптимизатор отсечет невостребованные строки.... мда, не все так радужно, оказывается |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
я не указал... уникальные из базы comment
блин, народ... Я вот проверяю и вижу что сама rand() даёт уникальные значения. -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
||||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
тогда вопрос остаётся...
или это всё же SQL нельзя сделать? -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
||||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
с запросом всё понятно, но...
усложняем запрос Есть таблицы main, comment, news, job необходимо получить - main.name - name.street - среднее значение comment.bal по main.id - количество записей в news по main.id - количество записей в job по main.id уж очень не хочется делать несколько выборок -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Dremlin |
|
|||
|
Quo vadis? ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 21.9.2006 Где: Киев Репутация: нет Всего: 4 |
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются... |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
Dremlin, выдаёт ошибку
И если можно поясни что такое INNER JOIN. Я в доках так и не нашёл толкового пояснения. И ещё, что это за синтаксис ...news.id_[main]... ...job.id_[main]... -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Dremlin |
|
||||
|
Quo vadis? ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 21.9.2006 Где: Киев Репутация: нет Всего: 4 |
Если прям так как написано запрос выполнял, то понятно, что ошибку
Вместо id_[main] нужно вписать имя поля, которое ссылается на таблицу main (в comment, например, - это поле id_kabak). А про INNER (LEFT, RIGHT, FULL) JOIN лучше почитать не в доках, а в любой книге по основам SQL. Если совсем коротко, то:
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются... |
||||
|
|||||
| muzer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Там ещё ошибка есть.
Выбираются и данные и результаты агрегатных функций, а в этом случае нужно указывать какую-либо группировку. В данном примере GROUP BY main.name, main.street Это не говоря о том, что count вернёт не те значения, которые просил автор Поясню на примере: естть три таблицы с двумя колонками и следующими строками table 1 | a | 1 | table 2 | a | 1 | | a | 2 | table 3 | a | 1 | | a | 2 | если все их сджойнить по приведённому примеру (по первой колонке), то результирующая таблица будет такая: table_result table1.1 table2.1 table3.1 table1.1 table2.2 table3.1 table1.1 table2.1 table3. 2 table1.1 table2.2 table3. 2 Как видно из примера, оба count'а вернут 4, хотя должны были вернуть 2. То есть правильный вариант:
|
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
muzer, спасибо за DISTINCT. И правда, совсем забыл про это..
Но, народ, мы совсем рабыли вопрос. Пытался сам переделать код, но он упрямо даёт только первую запись из main Я что-то совсем запутался в этих запросах... В общем уникальнае записи должны быть из таблицы main в общем, вопрос оказался сложнее чем я думал вот дамп базы
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| muzer |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Gold Dragon, Dremlin же ответил в самом первом посте.
Учитывая прибавившиеся таблицы:
Альтернативный вариант, лучше первого по производительности:
Да, и в обоих запросах, если в таблицах news, job и comment необязательно присутствуют записи для всех main, то INNER JOIN следует заменить на LEFT JOIN. Ну и наконец учитывая разнородность данных в таблицах news,job comment, то есть все они относятся к main, но не связаны между собой, оптимальней было бы выполнить четыре запроса: 1. выбрать main.id 2-4. из кжадой таблицы выбрать необходимые данные по выбранным id Но на этот счёт заморачивайтесь только если у вас большие объёмы информации. И особенно актуален этот совет, если вы захотите не только count'ы выбирать, но и сами данные. Это сообщение отредактировал(а) muzer - 26.1.2007, 21:51 |
||||
|
|||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
я вообще-то проверял запросы
да я так и делаю сейчас, но очень хочется использовать по максимому MySQL я делаю сейчас так
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |