Перейти к содержимому


Фотография
- - - - -

SQL question #2


  • Пожалуйста, авторизуйтесь, чтобы ответить
11 ответов в этой теме

#1 *soulburner*

*soulburner*

    You have reached level cap

  • True Members
  • PipPipPipPipPip
  • 5619 сообщений
225
Очень хороший
  • Пол:Мужчина

Опубликовано 06 February 2007 - 19:01

Помогите решить еще одну задачку ;)

Вобщем, имеется таблица юзеров:

users:
id | name
---------------
1  | Vasya
2  | Petya
3  | Grisha

и таблица их фото:

photos:
id|userid| filename
---------------------------------
1 |   1  | vasya1.jpg
2 |   1  | vasya2.jpg
3 |   1  | vasya2.jpg
4 |   2  | petya.jpg

Нужно сделать выборку из 1-й таблицы только тех, у кого есть фото (т.е. запись во 2-й таблице)
  • 0

#2 Helovek

Helovek

    Super True Member

  • True Members
  • PipPipPipPipPip
  • 1144 сообщений
8
Обычный
  • Пол:Мужчина
  • Город:Казакова 28/1

Опубликовано 06 February 2007 - 19:07

Чёт недарубаю чё сделать нада?
  • 0
Размещенное изображение
Размещенное изображение

#3 Igor Diakonov

Igor Diakonov

    Super True Member

  • Admin
  • PipPipPipPipPip
  • 10191 сообщений
226
Очень хороший
  • Пол:Мужчина
  • Город:SPB

Опубликовано 06 February 2007 - 19:22

Помогите решить еще одну задачку ;)

Вобщем, имеется таблица юзеров:

users:

id | name
---------------
1  | Vasya
2  | Petya
3  | Grisha

и таблица их фото:

photos:
id|userid| filename
---------------------------------
1 |   1  | vasya1.jpg
2 |   1  | vasya2.jpg
3 |   1  | vasya2.jpg
4 |   2  | petya.jpg

Нужно сделать выборку из 1-й таблицы только тех, у кого есть фото (т.е. запись во 2-й таблице)


Мне кстати тож интересно как правильно и быстро :))
Чёт туплю...на вскидку -
select users.id, users.name from users, photos where users.id=photos.userid group by users.id
или
select distinct users.id, users.name from users, photos where users.id=photos.userid
но эт имхо бред...как-то не так нада...а то тут будет тормозить при больших табличках
  • 0

#4 *soulburner*

*soulburner*

    You have reached level cap

  • True Members
  • PipPipPipPipPip
  • 5619 сообщений
225
Очень хороший
  • Пол:Мужчина

Опубликовано 06 February 2007 - 20:08

Чёт недарубаю чё сделать нада?

LOL ?

Мне кстати тож интересно как правильно и быстро :))
Чёт туплю...на вскидку -
select users.id, users.name from users, photos where users.id=photos.userid group by users.id
или
select distinct users.id, users.name from users, photos where users.id=photos.userid
но эт имхо бред...как-то не так нада...а то тут будет тормозить при больших табличках

Вот-вот.... по ходу, буду делать в users доп. поле "photos_num", которое буду обновлять :)
  • 0

#5 key

key

    -=SunKain=-

  • True Members
  • PipPipPipPipPip
  • 2489 сообщений
12
Обычный
  • Пол:Мужчина
  • Город:Аден

Опубликовано 06 February 2007 - 20:13

LOL ?
Вот-вот.... по ходу, буду делать в users доп. поле "photos_num", которое буду обновлять :)

вот с последним полем вообще лафа будет:)
но я только с JOIN-ом могу ответ придумать.
  • 0
Mess with the best
Die like the rest

Размещенное изображение

Пуля производит удивительные изменеия в голове, даже если она попала в задницу.
(С) Лукьяненко "Черновик"

Conseal nohing.
And watch the fools searching forever.

#6 Sky

Sky

    Advanced Member

  • True Members
  • PipPipPip
  • 60 сообщений
0
Обычный
  • Пол:Мужчина

Опубликовано 06 February 2007 - 23:57

вот с последним полем вообще лафа будет:)
но я только с JOIN-ом могу ответ придумать.


так а почему бы с join не написать? а на userid| поставить индекс.
  • 0

#7 sbash

sbash

    Super True Member

  • True Members
  • PipPipPipPipPip
  • 239 сообщений
0
Обычный

Опубликовано 13 February 2007 - 23:08

select * from users
where id in (select userid from photos)
  • 0

#8 n00wbie

n00wbie

    кто здесь? о.О

  • True Members
  • PipPipPipPipPip
  • 2681 сообщений
0
Обычный

Опубликовано 13 February 2007 - 23:51

памойму проще таг:
select * from photos where userid=users.id
  • 0
Размещенное изображение
Размещенное изображение
Размещенное изображение
//dpkg --make-me-cheesburger --with-cola --please-fastcgi

#9 Saturas

Saturas

    Snake king

  • True Members
  • PipPipPipPipPip
  • 917 сообщений
0
Обычный
  • Пол:Мужчина
  • Город:Ленинский 92/3

Опубликовано 14 February 2007 - 03:34

Правильно и "классически" будет так:

select users.* from users inner join photos on users.id = photos.userid
  • 0
Когда весна, теплом дразня,
скользит по мне горячим глазом,
ужасно жаль мне, что нельзя
залечь на две кровати разом.



#10 sbash

sbash

    Super True Member

  • True Members
  • PipPipPipPipPip
  • 239 сообщений
0
Обычный

Опубликовано 15 February 2007 - 23:36

Правильно и "классически" будет так:

select users.* from users inner join photos on users.id = photos.userid


Не правильно и не "классически"
получишь

id name
  1 Vasya
  1 Vasya
  1 Vasya
  2 Petya

тогда уж
select DISTINCT users.* from users inner join photos on users.id = photos.userid

но мой мне больше нравится

select * from users
where id in (select userid from photos group by userid)
  • 0

#11 Saturas

Saturas

    Snake king

  • True Members
  • PipPipPipPipPip
  • 917 сообщений
0
Обычный
  • Пол:Мужчина
  • Город:Ленинский 92/3

Опубликовано 15 February 2007 - 23:52

Не правильно и не "классически"
получишь

тогда уж
select DISTINCT users.* from users inner join photos on users.id = photos.userid

но мой мне больше нравится

select * from users
where id in (select userid from photos group by userid)


1) Мой запрос быстрее, потому что вместо вложенного запроса база подставляет индекс по полю photos.userid (подразумевается что индекс по полю userid был указан при создании таблицы, либо создан явно).
2) Вложенные запросы в Mysql поддерживаютя только с версии 4.1

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

PS. насчет DISTINCT согласен
  • 0
Когда весна, теплом дразня,
скользит по мне горячим глазом,
ужасно жаль мне, что нельзя
залечь на две кровати разом.



#12 sbash

sbash

    Super True Member

  • True Members
  • PipPipPipPipPip
  • 239 сообщений
0
Обычный

Опубликовано 15 February 2007 - 23:59

1) Мой запрос быстрее, потому что вместо вложенного запроса база подставляет индекс по полю photos.userid (подразумевается что индекс по полю userid был указан при создании таблицы, либо создан явно).
2) Вложенные запросы в Mysql поддерживаютя только с версии 4.1

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


1.Твой запрос _не работает_ без DISTINCT. читай условия задачи.
2.Когда прочтешь,найди где про Mysql написано.читай условия задачи.
3.Вложенный запрос работает быстрее чем иннер джоин,смотри план в том же Mysql
4."Добрая часть провайдеров" :)

Вывод ? ;)
  • 0


Посетителей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных пользователей