MySQL SELECT MAX несколько таблиц: foreach родитель возвращает фотографию старшего сына - PullRequest
0 голосов
/ 16 января 2011
**Table parent**
parentId | name

**Table children**
childId | parentId | pictureId | age

**Table childrenPictures**
pictureId | imgUrl

нет, я хотел бы вернуть имена всех родителей с фотографией их старшего сына (вернуть только родителей, у которых есть дети, и рассматривать только детей, у которых есть фотографии)

так что я подумал о чем-то вроде:

SELECT c.childId AS childId,
   p.name AS parentName,
   cp.imgUrl AS imgUrl,
   MAX(c.age) AS age
FROM parent AS p
   RIGHT JOIN children AS c ON (p.parentId = c.parentId)
   RIGHT JOIN childrenPictures AS cp ON (c.pictureId = cp.pictureId))
GROUP BY p.name

Этот запрос будет возвращать возраст старшего сына каждого родителя, но childId не будет соответствовать идентификатору старшего сына, поэтому в выходных данных не отображается изображение правильного сына.

Ответы [ 2 ]

2 голосов
/ 16 января 2011

вам нужно предварительно запросить информацию для каждой семьи, чтобы узнать возраст самого старшего ребенка, у которого есть изображение, а затем получить информацию об имени / изображении родителя ... что-то вроде ...

select
      PreQuery.parentID,
      p.Name ParentsName,
      c.childID,
      c.age,
      cp.imgUrl
   from 
      ( select 
              c.parentID,
              max(c.age) OldestChildAgeWithPicture
           from
              Children c,
              childrenPictures cp
           where
              c.pictureID = cp.pictureID
           group by 
              c.parentID ) PreQuery,
      Parent p,
      Children c,
      ChildrenPictures cp
   where
          PreQuery.parentID = p.parentID
      and PreQuery.parentID = c.parentID
      and PreQuery.OldestChildAgeWithPicture = c.age
      and c.pictureID = cp.pictureID

Внутреннийзапрос предварительно квалифицируется только по родителю, у ребенка самого высокого возраста, в котором существует изображение ... Итак, если у вас есть семья с 3 детьми, у самого старшего нет изображения, 2-й олдес делает, 2-й самый старый - тот, который будет показан в приведенном вышезапрос.Кроме того, что вы хотите сделать, если в семье есть близнецы, и ОБА имеют фотографии в файле.Этот запрос покажет ОБА детей, если возраст основан на фактическом целочисленном представлении.Однако, если возраст рассчитывается на основе арифметики даты и будет более точным ... Например: один ребенок, рожденный 1 января года X, и в течение того же года другой ребенок, рожденный 1 декабря .... По состоянию на декабрь, они будутбыть тем же самым целочисленным возрастом, но один, очевидно, на 11 месяцев старше другого.

Кроме того, если вы хотите, чтобы у самого старого изображения была НЕЗАБЫВАЕМАЯ, вышеприведенный запрос пришлось бы изменить лишь незначительно ... дайте мне знать, если это то, что вы ищете.

0 голосов
/ 16 января 2011

Не уверен, но пара замечаний: - Поскольку вы хотите вернуть родителей только с совпадающими детьми, вы можете просто присоединиться.- Не могли бы вы попробовать группу по c.parentID вместо группы по p.name?

...