"SELECT *, ((ACOS(SIN($lat * PI() / 180) * SIN(latitude * PI() / 180) + COS(78 * PI() / 180) * COS(latitude * PI() / 180) * COS((87 - longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance "
. "FROM `#__content` AS `b` "
. "RIGHT JOIN `#__jreviews_content` AS `a` ON (`a`.`contentid` = `b`.`id`) "
. "LEFT JOIN `#__categories` AS `c` ON (`b`.`catid` = `c`.`id`) "
. "LEFT JOIN `#__jreviews_media` AS `m` ON (`m`.`listing_id` = `b`.`id` AND `m`.`main_media` = 1 AND `m`.`media_type` = 'photo') "
. "WHERE 1 = 1 AND (`c`.`title` LIKE '%Stores%' OR `c`.`title` LIKE '%Dining%' OR `c`.`title` LIKE '%Events%') AND `a`.`jr_latitude`<> 0.0000000 AND `c`.`title`<> 'Archives' "
. "HAVING distance<='50' "
. "ORDER BY distance ASC"
HAVING
なしでQuery Object
を使用してクエリを作成できました
$query->select(array('*', '((ACOS(SIN($lat * PI() / 180) * SIN(latitude * PI() / 180) + COS(78 * PI() / 180) * COS(latitude * PI() / 180) * COS((87 - longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance'))
->from($content)
->join('RIGHT', $jreviews_content . ' ON (' . $db->quoteName('a.contentid') . ' = ' . $db->quoteName('b.id') . ')')
->join('LEFT', $categories . ' ON (' . $db->quoteName('b.catid') . ' = ' . $db->quoteName('c.id') . ')')
->join('LEFT', $media . ' ON (' . $db->quoteName('m.listing_id') . ' = ' . $db->quoteName('b.id') . ' AND ' . $db->quoteName('m.main_media') . ' = 1 AND ' . $db->quoteName('m.media_type') . ' = "photo")')
->where($conditions);
このQuery Object
にHAVING
を書くのを手伝ってください
Group_byなしでhaving
句を使用している場合、where句と同じように動作します。
JDatabaseQueryクラスは、having句のメソッドを提供します。
これを試して
$query->having('distance <=50');
投稿されたクエリにいくつかの絞り込みを追加したい...
1 = 1
にメリットはありません!=
を使用する方が直感的ですが、数値を比較する場合は<>
がより適切です。$lat
は、セキュリティを確保するために、floatとして型キャストする必要があります。a
から始めて、壊れた順序を使用するのではなく、そこから降りてください。私は盲目的にあなたの数学を信頼するつもりです。サンプルデータがなく、目的の出力がわからなければ、JOINの選択の正しさを完全に確信することはできないので、それらの側面はそのままにしておきます。
新しいRAW SQL:
SELECT *, (ACOS(SIN($lat * PI() / 180) * SIN(latitude * PI() / 180) + COS(78 * PI() / 180) * COS(latitude * PI() / 180) * COS((87 - longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515 AS distance
FROM #__content a
RIGHT JOIN #__jreviews_content b ON b.contentid = a.id
LEFT JOIN #__categories c ON a.catid = c.id
LEFT JOIN #__jreviews_media d ON d.listing_id = a.id
WHERE d.main_media = 1
AND d.media_type = 'photo'
AND c.title != 'Archives'
AND b.jr_latitude <> 0.0000000
AND c.title REGEXP 'Stores|Dining|Events'
HAVING distance <= 50
ORDER BY distance
HAVING
ロジックが実装されている場合、distance
列のエイリアスはまだ使用できないため、ここではWHERE
が必要です。
PHP/Joomlaの同等(テストされていない):
$query = $db->getQuery(true)
->select([
"*",
"(ACOS(SIN(" . (float)$lat . " * PI() / 180) * SIN(latitude * PI() / 180) + COS(78 * PI() / 180) * COS(latitude * PI() / 180) * COS((87 - longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515 AS distance"
])
->from("#__content a")
->rightJoin("#__jreviews_content b ON b.contentid = a.id")
->leftJoin("#__categories c ON a.catid = c.id")
->leftJoin("#__jreviews_media d ON d.listing_id = a.id")
->where([
"d.main_media = 1",
"d.media_type = " . $db->q("photo"),
"c.title != " . $db->q("Archives"),
"b.jr_latitude <> 0.0000000",
"c.title REGEXP " . $db->q("Stores|Dining|Events")
])
->having("distance <= 50")
->order("distance");