Автор Тема: Выборка основной и дополнительной информации за один запрос  (Прочитано 4096 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
Помогите плз с запросом - необходимо за один запрос выбрать информацию из двух таблиц, связанных уникальным ключем. При этом, одной записи в первой таблице может соответствовать 0 или несколько записей во второй.

Например.

Есть Таблица пользователей (users) и таблица с дополнительной информацией о пользователях. (info)

Users:


id_user | login | pass
----------------------
1       | log1    | pas1
2       | log2    | pas2
3       | log3    | pas3



Info:


id_user | name  | value
--------------------------
1       | icq   | 12345678
1       | email | log1@domen.com
2       | tel   | 223344


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

Например:


id_user | login | pass | icq      | email          | tel
----------------------------------------------------------
1       | log1    | pas1 | 12345678 | log1@domen.com | NULL
2       | log2    | pas2 | NULL     | NULL           | 223344
3       | log3    | pas3 | NULL     | NULL           | NULL



Через JOIN к сожалению не получается


SELECT *
FROM users
LEFT JOIN info ON info.id_user = users.id_user


Выбирается:


id_user | login | pass | id_user | name  |  value  
----------------------------------------------------
1       | log1  | pas1 | 1       | tel   | 23423423
1       | log1  | pas2 | 1       | email | log1@domen.com
2       | log2  | pas2 | 2       | tel   | 12345235
3       | log3  | pas3 | 3       | NULL  | NULL




То есть информация по пользователям дублируется согласно таблицы info.

При этом возникает проблема с конкретизацией выборки по нескольким дополнительным параметрам (в данном случае, например, по выбору пользователей, у которых определенный email и tel)
« Последнее редактирование: 07 Июля 2004, 08:39:39 от Foshvad »

Оффлайн tserbis

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 496
  • +0/-0
  • 0
    • Просмотр профиля
Странно... Зачем так хранить?
Ну, fetch\'и как обычно отсортированный по id пользователя JOIN и следи за сменой id\'шника.

Оффлайн tserbis

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 496
  • +0/-0
  • 0
    • Просмотр профиля
С 4.1, наверное, можно будет извратиться через GROUP_CONCAT.

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
tserbis
Цитировать
JOIN и следи за сменой id\'шника.


так понятно, но необходимо что одна строка соответствовала одному пользователю

Оффлайн tserbis

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 496
  • +0/-0
  • 0
    • Просмотр профиля
Foshvad
а сменить способ хранения уже поздно?

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
tserbis
Цитировать
а сменить способ хранения уже поздно?


Это отдельная тема, да и структура таблиц приведена упрощенная, для примера

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
Все, вопрос решил, но возникла другая проблема.
Думаю, для нее правильнее открыть другою тему, так как суть вопроса совсем другая.

В мое случае решение было следующее:

Цитировать

Select *
From Users
Join Info Tel On Tel.name = \'tel\' And Tel.id_user = Users.id_user
Join Info Mail On Mail.name = \'email\' And Mail.id_user = Users.id_user


Результат:



id_user  login  pass  id_user  name  value  id_user  name  value  
1 log1 pas1 1 tel 23423423 1 email log1@domen.com
3 log3 pas3 3 tel 03 3 email qqq

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28