Есть запрос типа SELECT `column1`, `column2` FROM `table` WHERE....
Нужно значения колонок `column1` и `column2` объеденить в одну, чтобы были только уникальные значения обеих колонок.
Спасибо!
Спустя 25 минут, 45 секунд (18.12.2008 - 10:55) kirik написал(а):
Пока решил через UNION
SQL |
(SELECT `column1` as `column` FROM `table` WHERE....) UNION (SELECT `column2` FROM `table` WHERE....) |
может есть более короткий способ?
Спустя 1 час, 43 минуты, 45 секунд (18.12.2008 - 12:39) Sylex написал(а):
kirik, вполне приемлимо

Спустя 8 часов, 56 минут, 40 секунд (18.12.2008 - 21:35) kirik написал(а):
Sylex, окей, спасибо!)
тогда правильно-ли будет джоинить таблицу к этому результату таким образом? -
тогда правильно-ли будет джоинить таблицу к этому результату таким образом? -
SQL |
SELECT `t1`.`column1` as `column1`, `t1`.`column2` as `column2`, `t2`.`column1` as `column3` FROM ( (SELECT `t1`.`column1`, `t1`.`column2` as `column` FROM `table1` as `t1` WHERE `t1`.`column3` = 'xxx') UNION (SELECT `t1`.`column1`, `t1`.`column3` FROM `table1` as `t1` WHERE `t1`.`column2` = 'xxx') ORDER BY `column1` ) as `t` INNER JOIN `table2` as `t2` ON `t`.`column` = `t2`.`column1` |
Спустя 31 минута, 2 секунды (18.12.2008 - 22:06) Sylex написал(а):
мутно как-то выходит...
SQL |
WHERE `t1`.`column3` = 'xxx' |
т.е. еще 3 поле есть?
Объясни на примере что ты хочешь сделать такое зверское

Спустя 5 часов, 11 минут, 31 секунда (19.12.2008 - 03:18) kirik написал(а):
=) Значит сделать хочу "друзей"
есть таблица users { user_id | username | ... } user_id - auto_increament
и есть таблица friends { friendship_id | user_id | friend_id | friendship_date } friendship_id - auto_increament, user_id и friend_id - индекы
Задача стоит следующая - вытащить всех друзей (а именно username-ы) для определенного пользователя.
Так как пользователь как может предлагать дружбу (user_id) так и принимать (friend_id) то его id может быть в 2х колнках - вот зачем понадобилось объеденить их результаты.
есть таблица users { user_id | username | ... } user_id - auto_increament
и есть таблица friends { friendship_id | user_id | friend_id | friendship_date } friendship_id - auto_increament, user_id и friend_id - индекы
Задача стоит следующая - вытащить всех друзей (а именно username-ы) для определенного пользователя.
Так как пользователь как может предлагать дружбу (user_id) так и принимать (friend_id) то его id может быть в 2х колнках - вот зачем понадобилось объеденить их результаты.
SQL |
(SELECT `f`.`friendship_id`, `f`.`friend_id` as `friend` FROM `friends` as `f` WHERE `f`.`user_id` = 1) UNION (SELECT `f`.`friendship_id`, `f`.`user_id` FROM `friends` as `f` WHERE `f`.`friend_id` = 1) ORDER BY `friendship_date` |
так собственно вытаскиваем всех друзей для юзера с id = 1
теперь нужно вытащить username для каждого друга -
SQL |
SELECT `t`.`friendship_id` as `friendship_id`, `t`.`friend` as `friend`, `u`.`username` as `username` FROM ((SELECT `f`.`friendship_id`, `f`.`friend_id` as `friend` FROM `friends` as `f` WHERE `f`.`user_id` = 1) UNION (SELECT `f`.`friendship_id`, `f`.`user_id` FROM `friends` as `f` WHERE `f`.`friend_id` = 1) ORDER BY `friendship_date` ) as `t` INNER JOIN `users` as `u` ON `t`.`friend` = `u`.`user_id` |
впринципе такой запрос работает, но хотелось бы узнать, насколько правильно он составлен =)
Спустя 6 часов, 58 минут, 37 секунд (19.12.2008 - 10:17) Sylex написал(а):
kirik, не понимаю тебя... а так типа не работает?
SQL |
SELECT f.friendship_id, f.friend_id, u.username FROM friends f JOIN users u WHERE u.user_id = 1 AND (u.user_id = f.friend_id OR u.user_id = f.friendship_id) |
Спустя 8 минут, 56 секунд (19.12.2008 - 10:26) Sylex написал(а):
или даже
SQL |
SELECT f.friendship_id, f.friend_id, u.username FROM friends f JOIN users u WHERE u.user_id = 1 AND ( f.friend_id = 1 OR f.friendship_id = 1) |
Спустя 36 минут, 9 секунд (19.12.2008 - 11:02) kirik написал(а):
точнее так, наверное
SQL |
SELECT f.friendship_id, f.friend_id, u.username FROM users_friends f JOIN users u WHERE u.user_id = 1 AND ( f.friend_id = 1 OR f.user_id = 1) |
но это не совсем то.. в итоге для юзера с id = 1 должен получиться массив вида
Код |
friendship_id => 1, friend_id => 3 friendship_id => 2, friend_id => 4 ... |
тоесть для этого юзера должны вытащиться все строки из таблицы friends где он или user_id (предложил дружбу), или friend_id - принимает дружбу.
а такой запрос выдает только friend_id, тоесть если этот юзер присутствует в строке как friend_id (принимающий дружбу), то выведется егоже id, а должен вывестись user_id (айдишник юзера, который предложил дружбу)..
сейчас пока работает решение с Union-ом, и последующим Join-ом..)
может тогда не стоит парится в поисках другого запроса..=)