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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
Есть две таблицы – с основной и дополнительной информацией.
Для постраничного вывода необходимо выбрать информацию об записях их определенного диапазона. В то время, как 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

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
Че-т с полями несостыковка....
Проверь...
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
первым запросом выбрать первых 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 + зависит от версии
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
AlieN
Где имено нестыковка? Все вроже Ctrl + C, Ctrl + V делал

Макс

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


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

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

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


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

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Цитировать
Foshvad:
а условия info не будут использованы
какие еще условия info ? Ты про WHERE ... ? У тебя в первоначальном запросе вообще условий никаких нет.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
Макс
Ну должны быть, я запрос упрощенный написал

наприме, если надо сделать постраничный вывод пользователей из определенного города. ID города хранится в таблице info

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Еще один. Ты ему ответ - а он тебе дополнительные условия выставит (которые вопрос в корне меняют).

Через временные таблицы делай
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

 

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