Общие > Базы данных

Применения LIMIT при постраничный вывод и объединении таблиц через JOIN

(1/2) > >>

Foshvad:
Есть две таблицы – с основной и дополнительной информацией.
Для постраничного вывода необходимо выбрать информацию об записях их определенного диапазона. В то время, как 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

--- Конец цитаты ---


то есть чтоб каждому пользователю соответствовала одна строка в выборке?

AlieN:
Че-т с полями несостыковка....
Проверь...

Макс:
первым запросом выбрать первых 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 + зависит от версии

Foshvad:
AlieN
Где имено нестыковка? Все вроже Ctrl + C, Ctrl + V делал

Макс


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


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

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


--- Цитировать ---Макс:
SELECT id_user FROM users LIMIT 0,5
--- Конец цитаты ---


LIMIT будет применен к таблице пользователей, а условия info не будут использованы

Макс:

--- Цитировать ---Foshvad:
а условия info не будут использованы
--- Конец цитаты ---
какие еще условия info ? Ты про WHERE ... ? У тебя в первоначальном запросе вообще условий никаких нет.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии