Получение записей + получение первой записи из другой таблицы + подсчет

Magiys

Новичок
Получение записей + получение первой записи из другой таблицы + подсчет

Здраствуйте!

Есть таблица, имеющая записи с уникальными ID [table1]:
ID1, data1
1, данные1
2, данные2

Есть вторая таблица, имеющая записи, связанные с первой таблицей по этим самым ID [table2].
ID2, data2, ID1
1, текст1, 1
2, текст2, 1
3, текст3, 2
4, текст4, 2

Необходимо получить:
ID1, data1, ID2, data2, количество_записей_в_table2_с_ID1
1, данные1, 1, текст1, 2
2, данные2, 3, текст3, 2

То есть в процессе нужно выбрать из таблицы 2 только одну первую запись при том, что их там несколько.

Пробывал через left join, но результатом будет 4 записи, то есть все из первой таблицы, и все соответсвенно из 2.

Заранее спасибо!
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Как пробовал?
 

Magiys

Новичок
Mr_Max
Пробывал так:
==================
SELECT * FROM table1 t1
LEFT JOIN
table2 t2 ON (t2.ID1=t1.ID2 LIMIT 1)
Что разумеется не работает, так как это неправильный синтаксис с LIMIT. Не надо смеятся, просто попробывал.
==================
==================
SELECT * FROM table1 t1
LEFT JOIN
table2 t2 ON t2.ID1 in (SELECT ... LIMIT 1 )
Так же не работает ( троеточие - не помню, что уже писал ), но суть одна: LIMIT там так же запрещено использовать при IN/NOT и пр.
==================
Pigmeich
Что ты имеешь в виду?
Bitterman
Насколькоя понимаю будет дейтсивтельно одна запись из второй таблицы, это правильный ответ на мой вопрос, спасибо.
Но тогда еще одно, а как получить, например две первые записи из второй таблицы?
 

Magiys

Новичок
Вот запрос, который я составил благодаря совету Bitterman:

SELECT
*, COUNT(t2.ID1) as SUM
FROM
table1 t1,
LEFT JOIN
table2 t2 ON t2.ID1=t1.ID1
GROUP BY
t1.ID1

Все работает, благодарю. Но появилась смежная проблема, как получить не только одну запись из второй таблицы, а две.
С GROUP BY, мне кажется, это уже не сделать.

Pigmeich
Объясню таким образом:
1. Все записи из первой таблицы.
2. По две первые записи из второй таблицы для каждой записи из первой таблицы, свзяь по ID.
3. Во второй таблице может и не быть записей для первой таблицы для некоторого ID.
4. Подсчитать количество записей во второй таблице для каждого ID первой таблицы.
Задачу с одной записью решили, но нужно для двух.
Спасибо за уделенное внимание.
 

zerkms

TDD infected
Команда форума
для двух задача не сложнее

SET @A := 0;

SELECT ... @A := @A + 1
GROUP BY CONCAT(`field`, @A % 2)
 

Magiys

Новичок
zerkms
Хорошая идея использовать переменные, только я не понимаю, что должно быть на месте field?
 

zerkms

TDD infected
Команда форума
Magiys
а по чему ты до этого группировал?

PS: можно и GROUP BY `field`, @A % 2
 

Magiys

Новичок
zerkms:
Сделал так...

SET @A := 0

SELECT
*, COUNT(t2.ID1) as SUM, @A := @A + 1
FROM
table1 t1,
LEFT JOIN
table2 t2 ON t2.ID1=t1.ID1
GROUP BY
t1.ID1, @A % 2

Ошибок не выдает, ведет себя так же как и предыдущий запрос. Замена в GROUP BY на t2.ID1, так же не помагает.

Я что-то напутал?
 

zerkms

TDD infected
Команда форума
хз, не должен
что-либо можно точнее сказать, увидев полную выборку без группировки вообще
 

Magiys

Новичок
Ну ладно, все равно спасибо. Я идею понял. Буду работать над этим, в крайнем случае можно использовать и одну запись.

-~{}~ 01.01.08 18:38:

Еще один вопрос, относящийся к запросу:

SELECT
*, COUNT(t2.ID1) as SUM
FROM
table1 t1,
LEFT JOIN
table2 t2 ON t2.ID1=t1.ID1
GROUP BY
t1.ID1

Мы получаем одну запись, но как получить эту определенную запись с сортировкой? Например поле data2 второй таблицы является датой. Как получить одну запись, но относительно поля даты, являющейся последней добавленной?
 

zerkms

TDD infected
Команда форума
миллион раз обсуждалось, юзай поиск
вкратце: чаще всего юзают подзапрос
 

Magiys

Новичок
Да, я уже нашел, спасибо.

-~{}~ 03.01.08 13:19:

Вот что получилось:
[SQL]
SELECT
t.*, tb2.*
FROM (
SELECT
table1.*, (
SELECT ID2
FROM table2
WHERE ID1=table1.ID1
ORDER BY Data2
LIMIT 1
) as table2_ID2
FROM
table1
GROUP BY
table1.ID1
) as t
LEFT JOIN
table2 as tb2 ON tb2.ID2 = t.table2_ID2
[/SQL]
t - временная таблица,
tb2 - таблица2,
table2_ID2 - ID2 таблицы 2

Но вот, как теперь подсчитать количество записей в таблице 2, соответствующих ID1 из первой таблицы? Создавать еще одну временную таблицу?
 

zerkms

TDD infected
Команда форума
2 вложенных запроса.... ппц ;)
а COUNT(*) в нужном месте не даёт нужного результата?
 

Magiys

Новичок
Автор оригинала: zerkms
2 вложенных запроса.... ппц ;)
а COUNT(*) в нужном месте не даёт нужного результата?
Ну так... :)
Самый глубокий SELECT - возвращает id из второй таблицы,
Средний - берет данные из первой таблицы,
Самый первый добавляет запись из второй таблицы

А вот для COUNT места не осталось, если его добавить в самый глубокий запрос, то там нужно будет использовать group by, то есть сортировка не будет работать, в средний - там считать нечего, так же как и в первом. Вот такие дела... :confused:

-~{}~ 03.01.08 16:17:

Добавил еще один селект, чтобы получить количество записей...
Скажите кто-нибудь, это вообще нормально так делать? Столько накручено... жуть.
[SQL]
SELECT
t.*, tb2.*
FROM (
SELECT
table1.*, (
SELECT ID2
FROM table2
WHERE ID1=table1.ID1
ORDER BY Data2
LIMIT 1
) as table2_ID2,
(
SELECT COUNT(*)
FROM table2
WHERE ID1=table1.ID1
) as sumRow2
FROM
table1
GROUP BY
table1.ID1
) as t
LEFT JOIN
table2 as tb2 ON tb2.ID2 = t.table2_ID2
[/SQL]
 

Gas

может по одной?
Лучше уж count считай не подзапросом, а во внутреннем select'е сделай left join к table2. C подзапросом же group by не нужен.
 

Magiys

Новичок
Автор оригинала: Gas
Лучше уж count считай не подзапросом, а во внутреннем select'е сделай left join к table2. C подзапросом же group by не нужен.
Да, так действительно лучше, спасибо:
[sql]
SELECT t . * , tb2 . *
FROM (
SELECT table1 . * , (
SELECT ID2
FROM table2
WHERE ID1 = table1.ID1
ORDER BY Data2
LIMIT 1
) AS table2_ID2,
COUNT(LJ_t2.ID2) as sumRow2
FROM table1
LEFT JOIN
table2 as LJ_t2 ON (LJ_t2.ID1 = table1.ID1)
GROUP BY
table1.ID1
) AS t
LEFT JOIN table2 AS tb2 ON tb2.ID2 = t.table2_ID2
[/sql]
То есть такие запросы, как я понял, - это норма...
 
Сверху