объеденение с таблицей, созданной подзапросом

berkut

Новичок
объеденение с таблицей, созданной подзапросом

Есть 2 таблицы:
Код:
CREATE TABLE `users` (
  `id` smallint(6) unsigned NOT NULL auto_increment,
  `total_friends` smallint(6) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;

CREATE TABLE `users_friends` (
  `user_id` smallint(9) unsigned NOT NULL default '0'
) ENGINE=MyISAM;
users.total_friends - это грубо говоря лимит, сколько у юзера может быть друзей максимум. В таблице users_friends хранятся уже друзья. users_friends.user_id - это внешний ключ к users.id
Хочу выяснить, сколько ещё друзей может поиметь юзер.
Код:
SELECT u.total_friends - temp.friends AS to_load, u.*, temp.*
FROM users u
     LEFT JOIN
     (
      SELECT COUNT(*) AS friends, user_id
      FROM users_friends
      GROUP BY user_id
     ) temp ON u.id = temp.user_id
Так вот, в поле to_load всегда Null!!! Козалось-бы, косяк в запросе, но u.*, temp.* же работают. А почему не может вычесть 2 поля это вопрос

-~{}~ 12.04.07 01:41:

LEFT JOIN в данной ситуации можно поменять на inner, всё равно будет выдаваться кол-во строк из users с to_load содержащим везде NULL. total_friends как видно объявленно как NOT NULL.
В догонку тогда ещё вопрос. У юзера в данный момент времени вообще может и не быть друзей(в users_friends). Тогда left join поставит null и вся арифметика накроется медным тазом. Вместо лимита будет стоять null, ибо 5 - Null == null
 

Bitterman

Новичок
Ужас какой-то...
Почему в таблице users_friends всего одно поле?
Запрос вообще без комментариев
[sql]
SELECT u.*, COUNT(f.UserID), (u.Total_Friends - COUNT(f.UserID)) as `Left`
FROM user as u
LEFT JOIN friends as f ON f.UserID=u.ID
GROUP BY u.ID
[/sql]
Так катит?
 

berkut

Новичок
Bitterman поле одно потому-как я сократил код до необходимого минимума. неудобно-же читать простыню из полей и ключей. А код твой то-же не работает - в Left везде Null
 

berkut

Новичок
нет, каунт работает.
я нашёл проблему. в u.total_friends изначально были (int) 0. А в таблице users_friends были значения для этих пользователей. В итоге u.total_friends - COUNT( f.user_id ) давало отрицательное значение и муська выдавала null
Решение проблемы:
CAST(u.total_friends AS SIGNED) - COUNT( f.user_id )

вообщем облажался я, тестил на данных, которые в реале быть не должны. total_friends всегда >= кол-во "друзей"
 
Сверху