Как упорядочить результаты запроса по связанному полю модели с условиями? - PullRequest
1 голос
/ 01 марта 2011

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

У меня есть следующие модельные отношения в CakePHP

Keyword hasMany Click

Я хочу создать запрос (либо через $ this-> Keyword-> find, либо с помощью пользовательского запроса), который будет возвращать список похожих ключевых слов, упорядоченных по количеству кликов, которые они получили за последнюю неделю. К сожалению, я не могу просто использовать поле counterCache 'click_count' для этого, потому что мне нужно только считать клики, которые произошли за последнюю неделю. Чтобы еще больше усложнить ситуацию, я должен добавить условие LIKE () и в поле ключевого слова.

Вот что у меня есть:

$result = $this->Keyword->find('all',array(
        'conditions' => array(
            'word_count >' => $keyword['Keyword']['word_count'],
            'UPPER(keyword) LIKE' => "%".strtoupper($keyword['Keyword']['keyword'])."%"
        ),
        'recursive' => 0,
        'limit' => 10
    ));

Мне просто нужно добавить бит, который сортирует эти результаты, по количеству связанных записей Click, где Click.created находится в течение последней недели. Я понял, что эта часть должна выглядеть примерно так:

array(
        'conditions' => array(
            'Click.created >' => date("Y-m-d",strtotime("1 week ago"))
        ),
        'fields' => array(
            'COUNT(Click.keyword_id) as count'
        ),
        'group' => 'Click.keyword_id',
        'order' => 'count DESC'
    );

Я просто не уверен, куда этот бит должен идти.

Пожалуйста, кто-нибудь может избавить меня от моих страданий? Спасибо:)

1 Ответ

1 голос
/ 01 марта 2011

Ну, мне удалось заполучить SQL-запрос, который делает то, что мне нужно, на этой странице: http://www.experts -exchange.com / Web_Development / Web_Languages-Standards / ASP / Q_20646898.html

Вот как это выглядит:

SELECT *
        FROM keywords
        AS Keyword
        LEFT JOIN (SELECT keyword_id,count(*) AS click_count FROM clicks GROUP BY keyword_id)
        AS Click
        ON Keyword.id = Click.keyword_id
        WHERE Keyword.word_count > ".$keyword['Keyword']['word_count']."
        AND UPPER(Keyword.keyword) LIKE '%".strtoupper($keyword['Keyword']['keyword'])."%'
        ORDER BY Click.click_count DESC

Надеюсь, кто-то найдет это полезным.

...