Запрос по новейшему связанному объекту - PullRequest
1 голос
/ 24 февраля 2012

У меня есть две сущности с отношением 1-N, например:

table_a
-------
id
name

table_b
------
id
table_a_id
name
status
created_at  

Я ищу способ в MySQL и особенно в Doctrine ORM для запроса table_a с помощью предложения where в table_b, которое влияет только на последнюю связанную запись table_b.

Предположим, у меня есть следующие записи:

table_a
----------------------------
id    | name
----------------------------
1     | john
2     | mary
3     | chuck

table_b
--------------------------------------------------
id    | table_a_id | name    | status | created_at
--------------------------------------------------
1     | 1          | blue    | 1      | 2000-01-01
2     | 1          | red     | 1      | 2012-12-31
3     | 2          | yellow  | 1      | 2000-01-01
4     | 2          | green   | 0      | 2012-12-31

Итак, я хочу сказать MySQL / Doctrine: Дай мне таблицу_а записей ЧТО ИМЕЕТ записи table_b И статус = 1 ВКЛ последние связанные элементы (в соответствии с полем созданного_атериала)

Это должно только вернуть:

table_a
----------------------------
id    | name
----------------------------
1     | john

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Согласно книге SQL Antipatterns , этот тип объединения с соответствующими индексами часто может работать лучше, чем подзапрос.Итак, попробуйте этот метод тоже:

SELECT a.*
FROM table_a a
JOIN table_b b1
  ON b1.table_a_id = a.id
  AND b1.status = 1
LEFT JOIN table_b b2
  ON b2.table_a_id = a.id
  AND b2.created_at > b1.created_at
WHERE b2.table_a_id IS NULL

Если из table_b может быть две строки со статусом 1, которые имеют одинаковую дату table_a_id и created_at, то вам потребуется DISTINCTчтобы избежать дубликатов:

SELECT DISTINCT a.*
FROM table_a a
JOIN table_b b1
  ON b1.table_a_id = a.id
  AND b1.status = 1
LEFT JOIN table_b b2
  ON b2.table_a_id = a.id
  AND b2.created_at > b1.created_at
WHERE b2.table_a_id IS NULL
0 голосов
/ 24 февраля 2012

Не уверен насчет «Доктрины», но запрос MySQL может быть

select
      a.ID,
      a.Name
   from
      table_b B
         join table_a A
            on B.table_a_id = A.ID
   where
      B.status = 1
   order by
      B.Created_At DESC
   limit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...