Получение одного поля привыборке из 2=х таблиц

 
0
 
MySQL
ava
Aver78 | 04.09.2016, 19:15
T1
         id
         1
         2
T2
        id pt_id
        1      1
        2      1
        3      1   
        4      2
        5      3
Select
    t1.id, t2.id
from
  t1
left join t2
  on t1.id=t2.pt_id

В результате  такого запроса будет таблица из 5 строк,
        t1.id  t2.id
          1        1
          1        2
          1        3
          2        4
          2        5
а нужно получить по 1 значению для каждого id из первой таблицы. Например по максимальному id второй.
то есть
        t1.id  t2.id
          1        3
          2        5


Ответы (14)
ava
Akina | 04.09.2016, 20:40 #
Цитата (Aver78 @  4.9.2016,  20:15 findReferencedText)
нужно получить по 1 значению для каждого id из первой таблицы

GROUP BY
Цитата (Aver78 @  4.9.2016,  20:15 findReferencedText)
максимальному id второй

MAX()
ava
Aver78 | 04.09.2016, 21:39 #
GROUP BY t2.id вообще ничего не даст, потому что они уникальны.
Наверное имелось в виду GROUP BY t1.id, но в этом случае при группировании возвращается строка с минимальным id.
Если же поставить еще  ORDER BY t2.id DESC то t2.id  возвращается правильный но остальные данные(их, ясен пень, больше в таблице чем я указал для примера) опять же соответсвуют минимальному  t2.id.
ava
Akina | 04.09.2016, 23:27 #
Цитата (Aver78 @  4.9.2016,  22:39 findReferencedText)
Наверное имелось в виду GROUP BY t1.id

Да.

Цитата (Aver78 @  4.9.2016,  22:39 findReferencedText)
в этом случае при группировании возвращается строка с минимальным id. 

Неспособность прочитать более половины ответа - это плохо...

Цитата (Aver78 @  4.9.2016,  22:39 findReferencedText)
Если же поставить еще  ORDER BY t2.id DESC

... как и способность прочитать в нём то, чего нет...
ava
Aver78 | 05.09.2016, 01:21 #
Критика - это хорошо конечно, но куда следует привязать max() - из ответа непонятно.
ava
igorold | 05.09.2016, 09:15 #
привяжи туда, где нужно максимальное значение, типа:

Select t1.id, max(t2.id)....
 
ava
Aver78 | 05.09.2016, 10:26 #

Select
    t1.id, max(t2.id)
from
  t1
left join t2
  on t1.id=t2.pt_id
GROUP BY t1.id

t2.id  возвращается правильный но остальные данные(их, ясен пень, больше в таблице чем я указал для примера) не соответсвуют  t2.id.
ava
igorold | 05.09.2016, 13:35 #
... про остальные поля речи не было, о чем спросили, то вам разжевали. Задавайте новый вопрос.
ava
Akina | 05.09.2016, 15:29 #
Цитата (Aver78 @  5.9.2016,  11:26 findReferencedText)
все неправильно возвращается

Всё возвращается правильно:

mysql> create table t1 (id int);
Query OK, 0 rows affected (0.03 sec)

mysql> create table t2 (id int, pt_id int);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t1 (id)
    -> select 1 union all
    -> select 2;
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into t2 (id, pt_id)
    -> select 1,1 union all
    -> select 2,1 union all
    -> select 3,1 union all
    -> select 4,2 union all
    -> select 5,3;
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

mysql> select * from t2;
+------+-------+
| id   | pt_id |
+------+-------+
|    1 |     1 |
|    2 |     1 |
|    3 |     1 |
|    4 |     2 |
|    5 |     3 |
+------+-------+
5 rows in set (0.00 sec)

mysql> Select
    ->     t1.id, max(t2.id)
    -> from
    ->   t1
    -> left join t2
    ->   on t1.id=t2.pt_id
    -> GROUP BY t1.id;
+------+------------+
| id   | max(t2.id) |
+------+------------+
|    1 |          3 |
|    2 |          4 |
+------+------------+
2 rows in set (0.05 sec)

Цитата (Aver78 @  5.9.2016,  11:26 findReferencedText)
остальные данные(их, ясен пень, больше в таблице чем я указал для примера) не соответсвуют  t2.id

А кто виноват, что ты спрашиваешь не то, что тебе нужно?
Цитата (Aver78 @  5.9.2016,  11:26 findReferencedText)
если я не ошибаюсь, вначале происходит группировка, а только потом из получившихся данных агрегирование в виде max.

Огорчу...
ava
igorold | 05.09.2016, 15:54 #
... какой-то глюк - вижу свои сообщения, которые с нового Винграда по 5 раз  :shok 
ava
Aver78 | 05.09.2016, 17:09 #
Меня так умиляют такие ответы. То есть некомпетентный ответ, данный в виде ребуса,не решающий проблему, засчитан за решение проблемы, да еще и 'разжеван' ?
ava
igorold | 06.09.2016, 06:09 #
... а почему ты решил, что тебе должны давать готовый ответ?
Akina дал тебе направление, чтобы ты сам шевелил мозгами, причем полностью соответствующее твоему вопросу а когда мозги включишь, то умиляться не придется ... 
ava
Akina | 05.09.2016, 17:55 #
Цитата (Aver78 @  5.9.2016,  18:09 findReferencedText)
Пытался упростить вопрос до предела.

Перестарался имхо. Вангую, что тебе нужно не только максимальный ID из второй таблицы, но и другие поля из записи с этим ID.
И если для решения ТАКОЙ задачи на некоторых других серверах БД ты мог воспользоваться оконными функциями, то в случае MySQL тебе скорее всего придётся использовать нарисованный выше запрос как подзапрос, и по полученной паре (id, pt_id) из ещё одной копии второй таблицы получать всю соотв. запись. И при этом крайне желательно гарантировать, что эта пара - уникальна.
Впрочем, это не единственный способ - и не единственная возможная постановка задачи. Почитай FAQ: Выборка первой/последней записи в группах - авось найдёшь чего для себя интересного...
ava
Aver78 | 05.09.2016, 17:58 #
Цитата (Akina @  5.9.2016,  17:55 findReferencedText)
Вангую, что

Ну тут и ванговать нечего, понятно что сам id мне не упал.

Цитата (Akina @  5.9.2016,  17:55 findReferencedText)
то в случае MySQL тебе скорее всего придётся использовать нарисованный выше запрос как подзапрос

Таким образом я уже решал вопрос, мне не нравятся подзапросы по ряду причин.



Цитата (Akina @  5.9.2016,  17:55 findReferencedText)
FAQ: Выборка первой/последней записи в группах

Поищу.

Спасибо.
ava
Akina | 05.09.2016, 18:02 #
Цитата (Aver78 @  5.9.2016,  18:58 findReferencedText)
Таким образом я уже решал вопрос, мне не нравятся подзапросы по ряду причин.


ИМХО разумнее было сразу озвучить задачу, а не модель, а заодно и причины, по которым использование подзапросов не нравится. Уже бы давно вышли на финишную прямую...
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  Akina ava  igorold   Aver78
advanced
Отправить