0

私は現在、このクエリを自分のWebサイトで実行しています。

public function searchCandidates($type=null, $gender=null, $age=null)
{
    //die(var_dump($age));
    if($age != false) {
        $age = implode(", %", $age);
    }

    $sql = 'SELECT `candidates`.`candidate_id`, 
                    `candidates`.`first_name`, 
                    `candidates`.`surname`, 
                    `candidates`.`gender`,
                    `candidates`.`DOB`, 
                    `candidates`.`talent`, 
                    `candidates`.`availability`,
                    `candidates`.`youtube_showreel_1`,
                    `candidates`.`youtube_showreel_desc_1`,
                    `candidates`.`date_created`,
                    `candidates`.`new_talent`,
                     DATE_FORMAT(NOW(), "%Y") - DATE_FORMAT(`candidates`.`DOB`, "%Y") - (DATE_FORMAT(NOW(), "00-%m-%d") < DATE_FORMAT(`candidates`.`DOB`, "00-%m-%d")) as `age`,
                    `candidate_assets`.`url`, 
                    `candidate_assets`.`asset_size`,
                    `candidate_assets`.`weight`
            FROM `candidates`
            LEFT JOIN `candidate_assets` ON `candidate_assets`.`candidates_candidate_id` = `candidates`.`candidate_id`
            WHERE `candidates`.`show_on_site` = "urban talent" AND `candidates`.`visible` = "yes" AND `candidate_assets`.`weight` = 1';
            //is there a certain criteria
            if($type != "0") { $sql .= ' AND `candidates`.`talent` LIKE "%'.$type.'%"'; }
            if($age != false) { $sql .= ' AND `candidates`.`playing_age` LIKE "%'.$age.'%"';}
            if($gender != false){ $sql .= ' AND `candidates`.`gender` = "'.$gender.'"'; }

            $sql .= ' GROUP BY `candidates`.`candidate_id` ORDER BY `candidates`.`surname` ASC, `candidate_assets`.`weight` ASC';

    $query = $this->db->query($sql);

    //die(print_r($query->result_array()));

    //echo $this->db->last_query();
    //die();
    return $query->result_array();
}

このクエリを希望どおりに機能させるのに苦労しています。ユーザーが画像(candidate_assetsurl)を持っているかどうかに関係なく、すべての結果を表示したいのですが、画像を持っている場合は、現時点では、私のクエリでは、1として重み付けされた画像を持つユーザーのみが返されます。

私が欲しいのは、すべてのユーザーを元に戻すことです。ユーザーが1つの画像(または複数の画像)を持っている場合は、重みが1の画像を返します。

私が間違っていることは何ですか?

4

2 に答える 2

0

where句で2番目のテーブルの列を使用する場合、LEFTJOINは違いがありません。where句でNULLになるようにするか、ON句に移動します。

あなたが持っている:

LEFT JOIN `candidate_assets` 
ON `candidate_assets`.`candidates_candidate_id` = `candidates`.`candidate_id`
WHERE `candidates`.`show_on_site` = "urban talent" 
AND `candidates`.`visible` = "yes" 
AND `candidate_assets`.`weight` = 1';

それを作る:

LEFT JOIN `candidate_assets` 
ON `candidate_assets`.`candidates_candidate_id` = `candidates`.`candidate_id`
AND `candidate_assets`.`weight` = 1 /*moved here*/
WHERE `candidates`.`show_on_site` = "urban talent" 
AND `candidates`.`visible` = "yes" 

またはおそらく(「論理的」ではない)

LEFT JOIN `candidate_assets` 
ON `candidate_assets`.`candidates_candidate_id` = `candidates`.`candidate_id`
WHERE `candidates`.`show_on_site` = "urban talent" 
AND `candidates`.`visible` = "yes" 
AND (`candidate_assets`.`weight` = 1 OR `candidate_assets`.`weight` IS NULL)

これで、必要なすべての行ができました。オプションで画像がある場合にのみ画像を選択するには、アプリケーションコードに画像を処理させるか、SELECT句をIFクエリで少し調整します。

于 2012-05-29T12:06:16.660 に答える
0

これを試して -

$sql = 'SELECT `candidates`.`candidate_id`, 
                `candidates`.`first_name`, 
                `candidates`.`surname`, 
                `candidates`.`gender`,
                `candidates`.`DOB`, 
                `candidates`.`talent`, 
                `candidates`.`availability`,
                `candidates`.`youtube_showreel_1`,
                `candidates`.`youtube_showreel_desc_1`,
                `candidates`.`date_created`,
                `candidates`.`new_talent`,
                 DATE_FORMAT(NOW(), "%Y") - DATE_FORMAT(`candidates`.`DOB`, "%Y") - (DATE_FORMAT(NOW(), "00-%m-%d") < DATE_FORMAT(`candidates`.`DOB`, "00-%m-%d")) as `age`,
                `candidate_assets`.`url`, 
                `candidate_assets`.`asset_size`,
                IF(`candidate_assets`.`url` IS NULL, 0, 1) AS `weight`
        FROM `candidates`
        LEFT JOIN `candidate_assets` ON `candidate_assets`.`candidates_candidate_id` = `candidates`.`candidate_id`
        WHERE `candidates`.`show_on_site` = "urban talent" AND `candidates`.`visible` = "yes"';
于 2012-05-29T12:06:22.287 に答える