Forum Webscript.Ru

Общие => Базы данных => Тема начата: Foshvad от 07 Июля 2004, 18:41:21

Название: Применения LIMIT при постраничный вывод и объединении таблиц через JOIN
Отправлено: Foshvad от 07 Июля 2004, 18:41:21
Есть две таблицы – с основной и дополнительной информацией.
Для постраничного вывода необходимо выбрать информацию об записях их определенного диапазона. В то время, как LIMIT применяется ко всем выбранным записям, в

Например:

Цитировать

CREATE TABLE users (
  id_user smallint(3) unsigned NOT NULL default \'0\',
  login varchar(50) NOT NULL default \'\',
  pass varchar(50) NOT NULL default \'\'
) TYPE=MyISAM;

INSERT INTO users VALUES (1, \'log1\', \'pas1\');
INSERT INTO users VALUES (2, \'log2\', \'pas2\');
INSERT INTO users VALUES (3, \'log3\', \'pas3\');

CREATE TABLE info (
  id_user smallint(3) unsigned NOT NULL default \'0\',
  name varchar(50) NOT NULL default \'\',
  value varchar(50) NOT NULL default \'\'
) TYPE=MyISAM;

INSERT INTO info VALUES (1, \'tel\', \'23423423\');
INSERT INTO info VALUES (2, \'tel\', \'03\');
INSERT INTO info VALUES (1, \'email\', \'log1@domen.com\');
INSERT INTO info VALUES (3, \'icq\', \'2\');
INSERT INTO info VALUES (3, \'email\', \'qqq\');
INSERT INTO info VALUES (3, \'tel\', \'03\');
INSERT INTO info VALUES (3, \'icq\', \'4\');
INSERT INTO info VALUES (3, \'icq\', \'5\');



SQL-запрос:

Цитировать

SELECT *
FROM users
JOIN info
USING ( id_user )


результат:

Цитировать

id_user  |  login  |  pass  |  id_user  |  name  |  value  
------------------------------------------------
1 |  log1 |  pas1 |  1 |  tel  | 23423423
2  | log2 |  pas2 |  2 |  tel  | 03
1  | log1 |  pas1 |  1 |  email  | log1@domen.com
3  | log3 |  pas3 |  3 |  icq  | 2
3  | log3  | pas3 |  3 |  email  | qqq
3  | log3 |  pas3 |  3 |  tel  | 03
3  | log3 |  pas3  | 3 |  icq |  4
3 |  log3 |  pas3  | 3 |  icq  | 5


То есть LIMIT 0,5 выбирает значения с 0 по 5. А надо пользователей и информацию о них с 0 до 5.

Как это можно обойти?

Или, быть может, можно выбрать информацию в виде

Цитировать

1 |  log1 |  pas1 |  1 |  tel  | 23423423  |  email  | log1@domen.com  |  icq |  4


то есть чтоб каждому пользователю соответствовала одна строка в выборке?
Название: Применения LIMIT при постраничный вывод и объединении таблиц через JOIN
Отправлено: AlieN от 07 Июля 2004, 19:26:51
Че-т с полями несостыковка....
Проверь...
Название: Применения LIMIT при постраничный вывод и объединении таблиц через JOIN
Отправлено: Макс от 07 Июля 2004, 19:56:01
первым запросом выбрать первых 5 id_user, а во втором
SELECT *
FROM users
JOIN info
USING ( id_user )
WHERE users.id_user IN (.......)

где вместо точек - те 5 id_user, которые ты получил в первом запросе

Можно попробовать еще :

SELECT *
FROM users
JOIN info
USING ( id_user )
WHERE users.id_user IN (
SELECT id_user FROM users LIMIT 0,5
)
не знаю, только сработает ли это в mysql + зависит от версии
Название: Применения LIMIT при постраничный вывод и объединении таблиц через JOIN
Отправлено: Foshvad от 08 Июля 2004, 09:18:40
AlieN
Где имено нестыковка? Все вроже Ctrl + C, Ctrl + V делал

Макс

Цитировать
Макс:
первым запросом выбрать первых 5 id_user, а во втором


та за два запроса понятно как.

Только при этом

Цитировать
Макс:
SELECT id_user FROM users LIMIT 0,5


LIMIT будет применен к таблице пользователей, а условия info не будут использованы
Название: Применения LIMIT при постраничный вывод и объединении таблиц через JOIN
Отправлено: Макс от 08 Июля 2004, 11:11:22
Цитировать
Foshvad:
а условия info не будут использованы
какие еще условия info ? Ты про WHERE ... ? У тебя в первоначальном запросе вообще условий никаких нет.
Название: Применения LIMIT при постраничный вывод и объединении таблиц через JOIN
Отправлено: Foshvad от 08 Июля 2004, 11:18:34
Макс
Ну должны быть, я запрос упрощенный написал

наприме, если надо сделать постраничный вывод пользователей из определенного города. ID города хранится в таблице info
Название: Применения LIMIT при постраничный вывод и объединении таблиц через JOIN
Отправлено: Макс от 08 Июля 2004, 11:33:58
Еще один. Ты ему ответ - а он тебе дополнительные условия выставит (которые вопрос в корне меняют).

Через временные таблицы делай