Обсуждение: query help request [2x]

Поиск
Список
Период
Сортировка

query help request [2x]

От
Andrei Ivanov
Дата:
Hello,
  I have 3 tables:

  users: id serial primary key, nick varchar and other stuff
  profiles: user_id which is a foreign key pointing to users(id),
            other things about the user (a user doesn't have to own a
            profile, but in this listing I want only users with a profile)
  pictures: id serial pk, user_id foreign key, picture varchar (a user
            doesn't have to own a picture or more)

What I want to do is to list all the users, something like this:

id, nick, stuff from profile, has_picture

has_picture is a flag which indicates if the user has a picture or not.

First time I did something like this:

SELECT u.id, u.nick, pr.keywords, COALESCE(p.id, 0) AS has_picture
FROM users u JOIN profiles pr ON u.id = pr.user_id
LEFT JOIN pictures p ON u.user_id = p.user_id;

but if a user has more than 1 picture, it is listed more then once.

Then I came up with this:

SELECT u.id, u.nick, pr.keywords,
  COALESCE((SELECT id FROM pictures WHERE user_id = u.id), 0) AS has_picture
FROM users u JOIN profiles pr ON u.id = pr.user_id;

but, if I understand it correctly, for each user, it will issue a query on
the pictures table to find a picture for that user, which I think it's an
overkill.

How can I do this right ? (I hope I didn't embarrassed myself by
overlooking an obvious answer.)

Thanks


Re: query help request [2x]

От
Tom Lane
Дата:
Andrei Ivanov <andrei.ivanov@ines.ro> writes:
> Then I came up with this:

> SELECT u.id, u.nick, pr.keywords,
>   COALESCE((SELECT id FROM pictures WHERE user_id = u.id), 0) AS has_picture
> FROM users u JOIN profiles pr ON u.id = pr.user_id;

This will actually fail if any user has more than one picture.

I think you have to go with

SELECT u.id, u.nick, pr.keywords,
  EXISTS(SELECT 1 FROM pictures WHERE user_id = u.id) AS has_picture
FROM users u JOIN profiles pr ON u.id = pr.user_id;

This should perform reasonably well as long as there's an index on
pictures.user_id.

            regards, tom lane


Re: query help request [2x]

От
Andrei Ivanov
Дата:
Thanks.
Anyway, my query works, I've tested it.. I just didn't like its lack of
elegance... :)

On Tue, 1 Apr 2003, Tom Lane wrote:

> Andrei Ivanov <andrei.ivanov@ines.ro> writes:
> > Then I came up with this:
>
> > SELECT u.id, u.nick, pr.keywords,
> >   COALESCE((SELECT id FROM pictures WHERE user_id = u.id), 0) AS has_picture
> > FROM users u JOIN profiles pr ON u.id = pr.user_id;
>
> This will actually fail if any user has more than one picture.
>
> I think you have to go with
>
> SELECT u.id, u.nick, pr.keywords,
>   EXISTS(SELECT 1 FROM pictures WHERE user_id = u.id) AS has_picture
> FROM users u JOIN profiles pr ON u.id = pr.user_id;
>
> This should perform reasonably well as long as there's an index on
> pictures.user_id.
>
>             regards, tom lane
>