* РЕДАКТИРОВАТЬ Я нашел более быстрый и лучший способ .. Требуется один запрос ..
Чтобы уточнить, какой запрос он имел выше:
«Однако мне также нужно иметь возможность поиска по« Соединенным Штатам »и иметь все записи в таблице объявлений, в которых есть катида, у которой также есть catfatherid этого элемента».
Так что нужно искать и катид, и кошек, чтобы найти возможных детей.
SELECT search.catid search_father_id, search.catname search_father_name,
ad_cat.catid child_id, ad_cat.catname child_name, count(*) total
FROM ad
RIGHT JOIN category ad_cat ON ad_cat.catid = ad.catid,
category search
WHERE search.catname LIKE '%United States%' AND (ad.catid = search.catid OR ad_cat.catfatherid = search.catid)
GROUP BY ad.catid
Вышеуказанный метод намного лучше, чем моя первоначальная попытка. Он запускается и не проходит несколько раз, но вместо этого проходит цикл и получает все значения без необходимости выполнять дополнительные запросы. Это также вернет детей в Соединенных Штатах, или если поиск штата просто вернет информацию о штатах.
Оригинальный ответ ниже:
SELECT ad.title,
p1.catid search_id, p1.catfatherid search_father_id, fc.catname search_fathername, p1.catname search_name,
p2.catname child_cat, p2.catid child_catid, count(*) total
FROM category p1,
category p2 RIGHT JOIN ad ON ad.catid = p2.catid,
category f RIGHT JOIN category fc ON fc.catfatherid = f.catid
WHERE p1.catname LIKE '%United States%' AND
p2.catid=(SELECT catid FROM category WHERE catid=if(p1.catfatherid=0, p2.catid, p1.catid))
GROUP BY ad.catid ORDER BY search_name
Итого в этом запросе явно нет. И потребует от вас сделать дополнительный запрос на результат.
PHP CODE:
while($f=mysql_fetch_assoc($sql1)){
$tq = mysql_query("select count(*) total from ad where catid='{$f['child_cat']}'");
$t = mysql_fetch_assoc($tq);
echo $t['total']; //Gives you total per result;
}
Я не могу гарантировать, что это лучший метод, поскольку он кажется тяжелым, так как кажется, что он тянет около 8 + 4 + 4 строк, глядя на общее количество, и занимает около 0,9 мс на этом небольшом кусочке данных. (Я добавил пару дополнительных строк в Аризонскую категорию «таблица объявлений»)
Надеюсь, кто-то еще здесь может взять это и оптимизировать это. Я не могу придумать другого способа сделать это сейчас.