Объединение таблиц - помогите с запросом ...

preg

Новичок
Объединение таблиц - помогите с запросом ...

Имеем 2 таблицы

user
-------------------
user_id int(11)
name varchar(255)
email varchar(255)
....

friends
-------------------
id int(11)
user_id int(11)

в первой таблице содержатся инфа о пользователях, во 2й ссылки на то кто с кем связан ...
данные идут примерно так:
1 2
1 3
1 4
1 5
2 2
2 3
2 4
и т.д.

суть в том чтобы по имени пользователя отобразить всех его друзей ...
делаю так:

SELECT user.* FROM user LEFT JOIN friends ON ( user.user_id = friends.id ) WHERE user.name = 'ник'
получаю результат, кол-во строк сходится, но все строки - одинаковые и = инфе о пользоветеле под ником 'ник' ...
пожалуйста ткните носом что делаю не так ...
 

zerkms

TDD infected
Команда форума
preg
ты сам выбираешь всё из таблицы user.*. и после этого удивляешься, что инфа только из неё????
попробуй SELECT *, о полученных результатах доложи.
 

preg

Новичок
видимо Вы не так поняли что нужно получить в итоге!!!
нужно получить полную инфу только из users но только о друзьях ...
вот как это реализовал без объединения таблиц:

// получение инфы о юзере (вытаскиваем его ID)
$info = $db->fast ( "SELECT user_id, name, email FROM users WHERE FWORD = '{$name}'" );

// получаем список ID всех его друзей
$db->query ( "SELECT user_id FROM friend WHERE id = '{$info['user_id']}'" );

// получаем инфу о всех друзьях!...
SELECT * FROM users WHERE id IN ( ... )
но имхо это не оптимально ...
 

zerkms

TDD infected
Команда форума
а я надеялся, что после последнего совета до тебя дойдёт, эх...

присоедини ещё раз к выборке таблицу users и выбери инфу о друзьях, чо ты как маленький...
 

iop

Новичок
SELECT * FROM user WHERE user_id IN
(
SELECT friends.user_id FROM friends WHERE id IN
( SELECT user.user_id FROM user WHERE FWORD = 'ник')
)
 

zerkms

TDD infected
Команда форума
iop
плохой запрос. делать нужно с 2 объединениями.
 

preg

Новичок
а я надеялся, что после последнего совета до тебя дойдёт, эх...

присоедини ещё раз к выборке таблицу users и выбери инфу о друзьях, чо ты как маленький...
вывод через * дал всё тот же результат! за исключением одного НО... изменились ID юзеров (они стали разными, походу id просто перекрылась из friends)! по остальным полям как были дубли так и остались...
Можете привести рабочий пример?

SELECT * FROM user WHERE user_id IN
(
SELECT friends.user_id FROM friends WHERE id IN
( SELECT user.user_id FROM user WHERE FWORD = 'ник')
)
все теже 3 запроса, но блин ... работает :)
выборка 40 записей заняло 27,281 сек. т.к. юзеров мноооого :)
а теже 3 запроса отдельно выполняются за 0.4 сек.
 

zerkms

TDD infected
Команда форума
все теже 3 запроса
запрос 1

Можете привести рабочий пример?
добавь ещё одно объединение. ещё одно INNER JOIN `users` `u2` ON `u2`.`user_id` = `friends`.`user_id`

а по поводу производительности - покажи SHOW CREATE TABLE для обеих таблиц
 

preg

Новичок
добавь ещё одно объединение. ещё одно INNER JOIN `users` `u2` ON `u2`.`user_id` = `friends`.`user_id`
сделал так:
SELECT * FROM user
INNER JOIN friends ON user.user_id = friends.id
INNER JOIN friends ON user.user_id = friends.user_id
WHERE
user.user_id = 44826;
выдало:
Not unique table/alias: 'friends'
подозреваю что это из за отсутсвия первичного ключа в friends, его нельзя добавить т.к. записи не уникальны....
вот сами таблы....
CREATE TABLE `user` (
`user_id` INTEGER(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) COLLATE cp1251_general_ci NOT NULL DEFAULT '',
`email` VARCHAR(100) COLLATE cp1251_general_ci NOT NULL DEFAULT '',
`full_name` VARCHAR(100) COLLATE cp1251_general_ci NOT NULL DEFAULT '',
`part` INTEGER(1) NOT NULL DEFAULT '0',
`cd` INTEGER(2) NOT NULL DEFAULT '0',
PRIMARY KEY (`user_id`, `name`),
UNIQUE KEY `FWID` (`user_id`),
KEY `FWORD` (`name`)
)ENGINE=InnoDB
AUTO_INCREMENT=339998 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
COMMENT='InnoDB free: 139264 kB';

CREATE TABLE `friends` (
`id` INTEGER(7) NOT NULL DEFAULT '0',
`user_id` INTEGER(7) NOT NULL DEFAULT '0',
KEY `fid` (`id`),
KEY `fwin` (`user_id`, `id`)
)ENGINE=InnoDB
CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
COMMENT='InnoDB free: 139264 kB';
 

Армян

Новичок
Используй AS, прямо же написано что имя таблицы френдс не уникально, чего тут подозревать :)
 

zerkms

TDD infected
Команда форума
preg
ппц.... ты понимаешь что ты вообще делаешь? :) или пишешь запросы наугад?
добавлять нужно ещё объединение с таблицой users.
 
Сверху