Forum Webscript.Ru
Общие => Базы данных => Тема начата: 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
то есть чтоб каждому пользователю соответствовала одна строка в выборке?
-
Че-т с полями несостыковка....
Проверь...
-
первым запросом выбрать первых 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 + зависит от версии
-
AlieN
Где имено нестыковка? Все вроже Ctrl + C, Ctrl + V делал
Макс
Макс:
первым запросом выбрать первых 5 id_user, а во втором
та за два запроса понятно как.
Только при этом
Макс:
SELECT id_user FROM users LIMIT 0,5
LIMIT будет применен к таблице пользователей, а условия info не будут использованы
-
Foshvad:
а условия info не будут использованы
какие еще условия info ? Ты про WHERE ... ? У тебя в первоначальном запросе вообще условий никаких нет.
-
Макс
Ну должны быть, я запрос упрощенный написал
наприме, если надо сделать постраничный вывод пользователей из определенного города. ID города хранится в таблице info
-
Еще один. Ты ему ответ - а он тебе дополнительные условия выставит (которые вопрос в корне меняют).
Через временные таблицы делай