Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Случайная выборка без повторов 
:(
    Опции темы
Gold Dragon
Дата 24.1.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Как осуществить случайный вывод N-го количества записей из 2-х таблиц при условии, что полученные значения не должны повторяться?
Или это одним SQL-запросом не обойтись?

Простой запрос выглядит так
Код

SELECT main.id
FROM `main` , `comment` 
WHERE comment.index =1
AND main.id = comment.id_kabak
ORDER BY RAND( ) 
LIMIT N



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Dremlin
Дата 24.1.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



Код

SELECT DISTINCT main.id
FROM `main` , `comment` 
WHERE comment.index =1
AND main.id = comment.id_kabak
ORDER BY RAND( ) 
LIMIT N

--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
skyboy
Дата 24.1.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



в зависимости от специфики задачи(например, если N<< count(*)), можно использовать RAND() в секции WHERE - не будет ни temporary, ни filesort. Работать будет быстрее на порядок. Но, естественно, теоретически возможна ситуация, когда будет выбрано менее N записей...
Код

SELECT DISTINCT main.id
FROM `main` 
INNER JOIN `comment` 
ON main.id = comment.id_kabak
WHERE RAND( ) > 0.5 AND  comment.index =1
LIMIT N


Добавлено @ 18:47 
хм... сказал глупость. ведь при использовании rand() в WHERE будет фулскан. А при использовании в ORDER BY - оптимизатор отсечет невостребованные строки.... 
мда, не все так радужно, оказывается smile
PM MAIL   Вверх
Gold Dragon
Дата 25.1.2007, 08:16 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



я не указал... уникальные из базы comment smile извиняйте

блин, народ... Я вот проверяю и вижу что сама rand() даёт уникальные значения.



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
skyboy
Дата 25.1.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Gold Dragon @  25.1.2007,  07:16 Найти цитируемый пост)
Я вот проверяю и вижу что сама rand() даёт уникальные значения.

нет, конечно. просто распределение близко к равномерному. потому если у тебя будет больше 1000 элементов(rand() возвращает три цифры после запятой?), увидишь повторение значений.
PM MAIL   Вверх
Gold Dragon
Дата 25.1.2007, 10:55 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



тогда вопрос остаётся...

или это всё же SQL нельзя сделать?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
skyboy
Дата 25.1.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Gold Dragon @  25.1.2007,  09:55 Найти цитируемый пост)
или это всё же SQL нельзя сделать? 

то, что уже сделано - чем не нравится? даже если rand() вернет в пределах выборки два одинаковых числа, это ж не значит, что одна запись продублируется, а другой не будет?! уникальность в твоем запросе не от rand() зависит.
PM MAIL   Вверх
Gold Dragon
Дата 25.1.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



с запросом всё понятно, но...

усложняем запрос
Есть таблицы main, comment, news, job
необходимо получить
- main.name
- name.street
- среднее значение comment.bal по main.id
- количество записей в news по main.id
- количество записей в job по main.id

уж очень не хочется делать несколько выборок smile


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Dremlin
Дата 25.1.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



Код

SELECT main.name, main.street, avg(comment.bal), count(news.id), count(job.id)
FROM
`main`
INNER JOIN `comment` ON main.id = comment.id_kabak
INNER JOIN `news` ON main.id = news.id_[main]
INNER JOIN `job` ON main.id = job.id_[main]

--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
Gold Dragon
Дата 26.1.2007, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Dremlin, выдаёт ошибку

И если можно поясни что такое INNER JOIN. Я в доках так и не нашёл толкового пояснения. 

И ещё, что это за синтаксис 
...news.id_[main]...
...job.id_[main]...



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Dremlin
Дата 26.1.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



Если прям так как написано запрос выполнял, то понятно, что ошибку  smile 

Цитата(Gold Dragon @  26.1.2007,  08:02 Найти цитируемый пост)
...news.id_[main]...
...job.id_[main]...

Вместо id_[main] нужно вписать имя поля, которое ссылается на таблицу main (в comment, например, - это поле id_kabak).

А про INNER (LEFT, RIGHT, FULL) JOIN лучше почитать не в доках, а в любой книге по основам SQL. Если совсем коротко, то:
Код

SELECT main.name, main.street, avg(comment.bal)
FROM `main` INNER JOIN `comment` ON main.id = comment.id_kabak
эквивалентно
Код

SELECT main.name, main.street, avg(comment.bal)
FROM `main`, `comment`
WHERE main.id = comment.id_kabak

--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
muzer
Дата 26.1.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Там ещё ошибка есть.
Выбираются и данные и результаты агрегатных функций, а в этом случае нужно указывать какую-либо группировку.
В данном примере GROUP BY main.name, main.street

Это не говоря о том, что count вернёт не те значения, которые просил автор smile
Поясню на примере:
естть три таблицы с двумя колонками и следующими строками
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.

То есть правильный вариант:

Код

SELECT main.name, main.street, avg(comment.bal), count(DISTINCT news.id), count(DISTINCT job.id)
FROM
`main`
INNER JOIN `comment` ON main.id = comment.id_kabak
INNER JOIN `news` ON main.id = news.id_[main]
INNER JOIN `job` ON main.id = job.id_[main]
GROUP BY main.name, main.street

PM WWW   Вверх
Gold Dragon
Дата 26.1.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



muzer, спасибо за DISTINCT. И правда, совсем забыл про это..

Но, народ, мы совсем рабыли вопрос. smile  Нужно вывести N-ое количество случайных записей.
Пытался сам переделать код, но он упрямо даёт только первую запись из main

Я что-то совсем запутался в этих запросах... В общем уникальнае записи должны быть из таблицы main


в общем, вопрос оказался сложнее чем я думал smile
вот дамп базы
Код

CREATE TABLE `comment` (
  `id` int(11) NOT NULL auto_increment,
  `index` tinyint(1) NOT NULL default '1',
  `id_kabak` int(11) NOT NULL default '0',
  `user_data` datetime NOT NULL default '0000-00-00 00:00:00',
  `user_com` text NOT NULL,
  `user_nik` varchar(30) NOT NULL default 'Кто-то',
  `user_mail` varchar(150) default NULL,
  `user_ip` varchar(15) NOT NULL default '0.0.0.0',
  `bal` tinyint(4) NOT NULL default '5',
  `adm_data` datetime default NULL,
  `adm_com` text,
  `adm_nik` varchar(30) default NULL,
  `adm_ip` varchar(15) default '0.0.0.0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Отзывы' AUTO_INCREMENT=53 ;

INSERT INTO `comment` VALUES (40, 1, 23, '2007-01-18 13:46:12', 'dfdf', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (39, 1, 26, '2006-12-27 14:28:54', 'fddfdffre', 'Кто-то', '', '127.0.0.1', 9, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (38, 1, 23, '2006-09-19 15:09:07', 'dsawefe fefwe fe текст приме соаки', 'Обжора', '[email protected]', '127.0.0.1', 5, '2006-12-27 12:16:50', '', '', '127.0.0.1');
INSERT INTO `comment` VALUES (37, 1, 23, '2006-09-19 15:07:35', 'jsd nто вфdahsadj jkhad s', 'Обжора', '', '127.0.0.1', 5, '2006-09-19 16:15:08', 'Это всё клевета. Такого не может быть по определению.', 'Администрация', '127.0.0.1');
INSERT INTO `comment` VALUES (36, 1, 23, '2006-09-09 15:56:08', 'Офигенные порции!!! И дешево и вкусно. <br><br>ЗЫ<br>я это сказал не про чебуреки :) они хоть и большие но мяса в них мало.', 'Обжора', '', '127.0.0.1', 8, '2006-09-19 00:00:00', 'Всегда рады вам угодить!', 'Алексей', '98.23.13.55');
INSERT INTO `comment` VALUES (35, 1, 26, '2006-09-09 15:52:36', 'Обожаю большие порции! Хоть наелся вчера до отвала :)', 'Обжора', '', '127.0.0.1', 7, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (33, 1, 24, '2006-09-11 15:44:47', 'Был в выходные там. Спокойно и приятно. Конечно, кухня стала немного хуже.', 'Кто-то', '', '127.0.0.1', 7, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (32, 1, 23, '2006-09-15 14:22:40', 'Может я мало ходила по другим кафе, но это считаю очень хорошим. Стоит не так уж и дорого, но порции большие. Да и выбрать есть что.<br>И ещё там мест много, знаешь что придёшь и поешь.', 'Юля', '', '127.0.0.1', 7, '2006-09-19 16:09:57', 'Всегда рады вам! <br>если что,звоните и приходите', 'Алексей', '127.0.0.1');
INSERT INTO `comment` VALUES (41, 1, 23, '2007-01-18 13:47:04', 'ytytty', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (42, 1, 23, '2007-01-18 13:47:12', 'ytytty', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (43, 1, 23, '2007-01-18 13:47:22', 'ytyttytyty', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (44, 1, 23, '2007-01-18 13:47:31', 'ytyttytytygffggf', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (45, 1, 23, '2007-01-18 13:47:41', 'kljfd sljk dsfklj', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (46, 1, 23, '2007-01-18 13:49:29', 'erwrfrwrerefwe', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (47, 1, 23, '2007-01-18 13:49:46', 'erwrfrwrerefwe<br><br>er<br>re<br>er<br>re', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (48, 1, 23, '2007-01-18 13:49:54', 'erwrfrwrerefweesdfdfsrreerre', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (49, 1, 23, '2007-01-18 13:50:03', 'erwrfrwrerefweesdfdfsrreer<br><br>fd<br>fd<br>fd<br>sfd<br>re', 'Кто-то', '', '127.0.0.1', 5, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (50, 1, 24, '2007-01-24 10:37:14', 'sdsddsdsdsdsds', 'Кто-то', '', '127.0.0.1', 8, '0000-00-00 00:00:00', '', '', '');
INSERT INTO `comment` VALUES (51, 1, 27, '2007-01-24 10:37:56', 'олрыф лофы', 'Кто-то', '', '127.0.0.1', 2, '0000-00-00 00:00:00', '', '', '');

CREATE TABLE `job` (
  `id` int(11) NOT NULL auto_increment,
  `id_kabak` int(11) NOT NULL default '0',
  `job` varchar(150) NOT NULL default '',
  `com` text,
  `data_start` date NOT NULL default '0000-00-00',
  `index` int(11) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Вакансии кабака' AUTO_INCREMENT=9 ;

INSERT INTO `job` VALUES (4, 26, 'Повар', 'На постоянную раотутреуется повар. Оклад: 5000 рублей. Полный раочий день. тел: 454-334', '2006-09-18', 1);
INSERT INTO `job` VALUES (5, 23, 'Администратор', 'kllkdsajkljdsal', '2007-01-22', 1);
INSERT INTO `job` VALUES (6, 24, 'Охранник', 'оолв рлshkh jkhsd jkh dksj', '2007-01-11', 1);
INSERT INTO `job` VALUES (7, 25, 'Шеф-повар', 'олрыв лор sdhjkh jskadh jkhdsajk kdshjkhsdj', '2007-01-08', 1);
INSERT INTO `job` VALUES (8, 27, 'Официант', 'выло kljd klj  sdj kjkldsj ', '2007-01-24', 1);

CREATE TABLE `main` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(200) NOT NULL default 'неизвестно',
  `fotom` varchar(10) NOT NULL default 'fotom0.gif',
  `foto1` varchar(8) NOT NULL default '0000.gif',
  `foto2` varchar(8) NOT NULL default '0000.gif',
  `foto3` varchar(8) NOT NULL default '0000.gif',
  `city` varchar(30) NOT NULL default 'Тамбов',
  `area` varchar(30) NOT NULL default 'неизвестно',
  `street` varchar(200) NOT NULL default 'неизвестно',
  `dom` varchar(6) NOT NULL default '0',
  `tel` varchar(50) NOT NULL default 'неизвестно',
  `email` varchar(150) NOT NULL default 'неизвестно',
  `site` varchar(150) NOT NULL default 'неизвестно',
  `parking` varchar(30) NOT NULL default 'неизвестно',
  `proezd` text,
  `rezim` varchar(255) NOT NULL default '00:00-00:00',
  `menu1` varchar(255) NOT NULL default 'нет#0#нет',
  `menu2` varchar(255) NOT NULL default 'нет#0#нет',
  `menu3` varchar(255) NOT NULL default 'нет#0#нет',
  `menu4` varchar(255) NOT NULL default 'нет#0#нет',
  `menu5` varchar(255) NOT NULL default 'нет#0#нет',
  `menu6` varchar(255) NOT NULL default 'нет#0#нет',
  `menu7` varchar(255) NOT NULL default 'нет#0#нет',
  `menu8` varchar(255) NOT NULL default 'нет#0#нет',
  `menu9` varchar(255) NOT NULL default 'нет#0#нет',
  `menu10` varchar(255) NOT NULL default 'нет#0#нет',
  `menu11` varchar(255) NOT NULL default 'нет#0#нет',
  `dish` varchar(255) NOT NULL default 'неизвестно',
  `menu_ps` text,
  `smoke` varchar(20) NOT NULL default 'неизвестно',
  `music` varchar(100) NOT NULL default 'неизвестно',
  `check` varchar(20) NOT NULL default 'неизвестно',
  `biznes` varchar(20) NOT NULL default 'неизвестно#0000#0',
  `emany` varchar(255) NOT NULL default 'неизвестно',
  `billiard` varchar(20) NOT NULL default 'неизвестно',
  `bouling` varchar(20) NOT NULL default 'неизвестно',
  `casino` varchar(20) NOT NULL default 'неизвестно',
  `games` varchar(20) NOT NULL default 'неизвестно',
  `karaoke` varchar(20) NOT NULL default 'неизвестно',
  `disko` varchar(30) NOT NULL default 'неизвестно',
  `zakaz` varchar(20) NOT NULL default 'неизвестно',
  `kalyan` varchar(20) NOT NULL default 'неизвестно',
  `kondiz` varchar(20) NOT NULL default 'неизвестно',
  `bar` varchar(20) NOT NULL default 'неизвестно',
  `tv` varchar(20) NOT NULL default 'неизвестно',
  `ws` varchar(20) NOT NULL default 'неизвестно',
  `striptiz` varchar(20) NOT NULL default 'неизвестно',
  `vhod` varchar(30) NOT NULL default 'неизвестно',
  `servis_ps` text,
  `control` int(11) NOT NULL default '0',
  `data` datetime NOT NULL default '0000-00-00 00:00:00',
  `index` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Описание кабаков' AUTO_INCREMENT=29 ;

INSERT INTO `main` VALUES (26, 'Дети солнца', 'fotom0.gif', '0000.gif', '0000.gif', '0000.gif', 'Тамбов', 'неизвестно', 'Интернациональная', '0', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', NULL, '00:00-00:00', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно', NULL, 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', NULL, 0, '0000-00-00 00:00:00', 1);
INSERT INTO `main` VALUES (25, 'Золотая рыбка', 'fotom0.gif', '0000.gif', '0000.gif', '0000.gif', 'Тамбов', 'неизвестно', 'Интернациональная', '0', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', NULL, '00:00-00:00', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно', NULL, 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', NULL, 0, '0000-00-00 00:00:00', 1);
INSERT INTO `main` VALUES (24, 'Старый Тамбов', 'fotom0.gif', '0000.gif', '0000.gif', '0000.gif', 'Тамбов', 'неизвестно', 'Интернациональная', '0', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', NULL, '00:00-00:00', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно#неизвестно#нет', 'неизвестно', NULL, 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', NULL, 0, '0000-00-00 00:00:00', 1);
INSERT INTO `main` VALUES (23, 'Дебют', 'fotom0.gif', '0000.gif', '0000.gif', '0000.gif', 'Тамбов', 'Ленинский', 'Советская', '72', 'неизвестно', 'неизвестно', 'неизвестно', 'есть возможность парковки', NULL, '00:00-00:00', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'неизвестно', NULL, 'есть', 'есть', 'есть', 'есть#1214#70', 'есть', 'есть', 'есть', 'есть', 'есть', 'зал караоке', 'есть', 'есть', 'есть', 'есть', 'есть', 'есть', 'есть', 'есть', 'есть', NULL, 230, '2006-09-19 00:00:00', 1);
INSERT INTO `main` VALUES (27, 'Омур', 'fotom0.gif', '0000.gif', '0000.gif', '0000.gif', 'Тамбов', 'неизвестно', 'Пролетарская', '0', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', NULL, '00:00-00:00', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'нет#0#нет', 'неизвестно', NULL, 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно#0000#0', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', 'неизвестно', NULL, 0, '0000-00-00 00:00:00', 1);

CREATE TABLE `news` (
  `id` int(11) NOT NULL auto_increment,
  `id_kabak` int(11) NOT NULL default '0',
  `news` text NOT NULL,
  `data_start` datetime NOT NULL default '0000-00-00 00:00:00',
  `data_end` datetime NOT NULL default '0000-00-00 00:00:00',
  `foto` varchar(8) default NULL,
  `index` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Новости по кабаку' AUTO_INCREMENT=19 ;

INSERT INTO `news` VALUES (16, 0, 'Ну будем считать <b>7 сентября 2006 года</b> Днём Рождения этого сайта! Многое ещё нужно сделать, но начало положено. Очень надеюсь, что сайт вам понравиться и вы будете участвовать в этом проекте.', '2006-09-07 00:00:00', '0000-00-00 00:00:00', NULL, 1);
INSERT INTO `news` VALUES (17, 0, 'Адрес сайта пока временный, но как только, так мы сразу переедем на <b>www.top-kabak.ru</b>\r\nНе уверен что это случится до нового года, но это случится.', '2006-09-11 00:00:00', '0000-00-00 00:00:00', NULL, 1);
INSERT INTO `news` VALUES (18, 26, 'тест', '2006-09-18 00:00:00', '0000-00-00 00:00:00', NULL, 1);





--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
muzer
Дата 26.1.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 387
Регистрация: 31.8.2006

Репутация: 30
Всего: 31



Gold Dragon, Dremlin же ответил в самом первом посте.

Учитывая прибавившиеся таблицы:

Код

SELECT main.name, main.street, avg(comment.bal), count(DISTINCT news.id), count(DISTINCT job.id)
FROM
`main`
INNER JOIN `comment` ON main.id = comment.id_kabak
INNER JOIN `news` ON main.id = news.id_kabak
INNER JOIN `job` ON main.id = job.id_kabak
GROUP BY main.name, main.street
ORDER BY RAND()
LIMIT N


Альтернативный вариант, лучше первого по производительности:

Код

SELECT tmp_main.name, tmp_main.street, avg(comment.bal), count(DISTINCT news.id), count(DISTINCT job.id)
FROM
(SELECT id,name,street FROM `main` ORDER BY RAND() LIMIT N) tmp_main
INNER JOIN `comment` ON tmp_main.id = comment.id_kabak
INNER JOIN `news` ON tmp_main.id = news.id_kabak
INNER JOIN `job` ON tmp_main.id = job.id_kabak
GROUP BY tmp_main.name, tmp_main.street


Да, и в обоих запросах, если в таблицах 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
PM WWW   Вверх
Gold Dragon
Дата 29.1.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Цитата(muzer @  26.1.2007,  21:51 Найти цитируемый пост)
Gold Dragon, Dremlin же ответил в самом первом посте.
я вообще-то проверял запросы smile и все они выдают только первую запись из таблицы main. Твой кстати тоже.

Цитата(muzer @  26.1.2007,  21:51 Найти цитируемый пост)
оптимальней было бы выполнить четыре запроса:

да я так и делаю сейчас, но очень хочется использовать по максимому MySQL

я делаю сейчас так
Код

// получая случайное n-oe количество 
SELECT * FROM `main` WHERE `index` =1 ORDER BY RAND( ) LIMIT n
...
// затем в цикле прогоняю эти запросы
SELECT * FROM `comment` WHERE `index`=1 AND `id_kabak`='.$result['id'];

SELECT * FROM `news` WHERE `index`=1 AND `id_kabak`='.$result['id'];

SELECT * FROM `job` WHERE `index`=1 AND `id_kabak`='.$result['id'];

SELECT avg(`bal`) AS `bal` FROM `comment` WHERE `index`=1 AND `id_kabak`=".$result['id'].' GROUP BY `id_kabak`';



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0645 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.