У меня есть следующие таблицы:
ТАБЛИЦА: категория
catid catfatherid catname
1 0 United States
2 1 Arizona
3 1 Arkansas
4 1 California
и TABLE: ad
adid catid title
1 2 Arizona Item
2 3 Arkansas Item
3 4 California Item
Я могу присоединиться к ним без каких-либо проблем и найти элемент, который я ищу, например:
SELECT category.catid, category.catfatherid, category.catname, A.adid, A.title
FROM ad A
LEFT JOIN category AS category ON A.catid = category.catid
where category.catname LIKE '%%Arizona%%'
Тем не менее, мне также нужно иметь возможность искать по "Соединенным Штатам" и иметь все записи в таблице объявлений, в которых есть catid, который также имеет catfatherid этого элемента.
Любые идеи о том, как это сделать?
Таблица SQL ниже...
CREATE TABLE `ad` (
`adid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`catid` int(11) NOT NULL,
`title` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`adid`)
);
INSERT INTO `ad` (`adid`, `catid`, `title`)
VALUES
(1,2,'Arizona Item'),
(2,3,'Arkansas Item'),
(3,4,'California Item');
CREATE TABLE `category` (
`catid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`catfatherid` int(11) DEFAULT NULL,
`catname` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`catid`)
);
INSERT INTO `category` (`catid`, `catfatherid`, `catname`)
VALUES
(1,0,'United States'),
(2,1,'Arizona'),
(3,1,'Arkansas'),
(4,1,'California');
* EDIT Я нашел более быстрый и лучший способ. Требуется один запрос.
Чтобы уточнить, какой у него был запрос: "Тем не менее, мне также нужно иметь возможность искать по" Соединенным Штатам "и иметь все записи в таблице объявлений, в которых есть catid, который также имеет 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 мс на этом небольшом количестве данных. (Я добавил несколько дополнительных строк в таблицу объявлений категории "Аризона" )
Надеюсь, кто-то другой может это сделать и оптимизировать. Я не могу придумать другой способ в этот момент сделать это.
Итак, вы хотите включить объявление, подобное этому?
adid catid title
4 1 USA Item1
5 1 USA Item2
используйте этот запрос:
SELECT category.catid,
category.catfatherid,
category.catname,
a.adid,
a.title
FROM ad a
LEFT JOIN category AS category
ON a.catid = category.catid
WHERE category.catname LIKE '%%Arizona%%'
OR category.catid IN (SELECT catfatherid
FROM category
WHERE catname LIKE '%%Arizona%%')
Или вы хотите включить также объявления Arkansas Item
и California Item
, которые относятся к категории United States
, категории, заданной LIKE?
SELECT category.catid,
category.catfatherid,
category.catname,
a.adid,
a.title
FROM ad a
LEFT JOIN category AS category
ON a.catid = category.catid
WHERE category.catfatherid IN (SELECT catfatherid
FROM category
WHERE catname LIKE '%%Arizona%%')
SELECT category.catid, category.catfatherid, category.catname, A.adid, A.title
FROM ad A
LEFT JOIN category AS category ON A.catid = category.catid
WHERE
category.catfatherid = (select catfatherid
FROM category WHERE catname LIKE '%United States%' limit 1)
Может работать с подзапросом или стоит делать в двух запросах, как было бы легче в системе.