Помогите сформировать SQL Запрос

Discussion in 'PHP' started by drLex, 18 Apr 2010.

  1. drLex

    drLex New Member

    Joined:
    17 Mar 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Всем здрасти!

    Помогите пожалуйста!

    Нужно составить такой запрос:

    Code:
    SELECT `y`.`id`, `x`.`date` 
    FROM `x` , `y`   
    WHERE `x`.`date` < UNIX_TIMESTAMP()  
    AND `x`.`date` = MAX(`x`.`date`)  
    AND `x`.`id` = `y`.`id`
    Только этот код не правильный, там функцию MAX() в сравнении нельзя применять. Я этот код написал чтобы на примере показать что мне надо.

    т.е. из нескольких результатов мне нужно выбрать только один результат, где `x`.`date` максимальное и удовлетворяет условию `x`.`date` < UNIX_TIMESTAMP()

    Я знаю что там нужно както через JOIN делать, просьба на ссылки не отправлять, все равно не могу понять как он работает.

    Если кто JOIN юзать умеет, напишите плиз на примере моего кода как это нужно сделать.

    Спасибо!
     
  2. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Используйте подзапрос
    Code:
    AND `x`.`date` = (SELECT MAX(`x`.`date`) FROM `x`)...
    
     
  3. drLex

    drLex New Member

    Joined:
    17 Mar 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Неа...
    Там еще условие `x`.`id` = `y`.`id`
    Т.е. результатов может быть несколько
    А в подзапросе `x`.`date` = (SELECT MAX(`x`.`date`) FROM `x`)... Возможен только один единственный результат

    Значит я не правильный пример показал

    Попробую еще раз:
    Code:
    SELECT `y`.`id`  
    FROM `x` , `y`   
    WHERE MAX(`x`.`date`) < UNIX_TIMESTAMP()   
    AND `x`.`id` = `y`.`id`
    Может так будет понятно?

    ...
    Или так?
    Code:
    SELECT `y`.`id`, `x`.`date`  
    FROM `x` , `y`     
    WHERE `x`.`id` = `y`.`id`
    Этот запрос возвращает несколько результатов с несколькими значениями `x`.`date` для каждого `y`.`id`

    `y`.`id` | `x`.`date`
    1 | 1271606772
    1 | 1271606723
    1 | 1271606847 - максимальное значение `x`.`date` для `y`.`id` = 1
    4 | 1271606455
    4 | 1271606754 - максимальное значение `x`.`date` для `y`.`id` = 4

    Из этих результатов нужно выбрать `x`.`date` который максимальный для этого `y`.`id` и удовлетворяет условию `x`.`date` < UNIX_TIMESTAMP()

    если 1271606847 < UNIX_TIMESTAMP() то оно пойдет в результат
    если 1271606754 < UNIX_TIMESTAMP() то оно пойдет в результат

    Вот такое вот надо както в одном запросе сделать...
     
  4. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    FROM `x` , `y` - фром сразу из двух таблиц через запятую?)

    По русски, без кода, на словах объясни, что тебе нужно, объяснять свои желания на примере "понятного" только тебе кода не есть хорошая идея
     
  5. drLex

    drLex New Member

    Joined:
    17 Mar 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Да, а что это запрещено?
    Я объснил как мог, и словами и кодом...
     
  6. nikp

    nikp Banned

    Joined:
    19 Sep 2008
    Messages:
    328
    Likes Received:
    591
    Reputations:
    764
    Code:
    SELECT `y`.`id`, `x`.`date` 
    FROM `x` , `y`   
    WHERE `x`.`date` in (SELECT MAX(`x`.`date`) FROM `x` WHERE `x`.`date` < UNIX_TIMESTAMP())
    AND `x`.`id` = `y`.`id`
    
    или

    Code:
    SELECT `y`.`id`, `x`.`date` 
    FROM `x`  INNER JOIN `y`   ON `x`.`id` = `y`.`id`
    WHERE `x`.`date` in (SELECT MAX(`x`.`date`) FROM `x` WHERE `x`.`date` < UNIX_TIMESTAMP())
     
    #6 nikp, 18 Apr 2010
    Last edited: 18 Apr 2010
    1 person likes this.
  7. drLex

    drLex New Member

    Joined:
    17 Mar 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Решение найдено!

    оно:
    Code:
    SELECT `y`.`id` , `x`.`date`, MAX( `x`.`date` ) AS `max_date`
    FROM `x` , `y` 
    WHERE `x`.`id` = `y`.`id`
    GROUP BY `y`.`id`
    HAVING (`max_date` < UNIX_TIMESTAMP())
    
    Всем Спасибо!