我有以下表格:
表:类别
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');
答案 0 :(得分:1)
*编辑我发现了一种更快更好的方法..需要一个查询..
澄清他上面的要求: “但是,我还需要能够通过”美国“进行搜索,并且广告表中的所有条目都有一个catid也会显示该项目的catteeid。”
因此,需要考虑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.9ms。 (我在亚利桑那州的“广告表”中添加了几行额外的行)
希望此处的其他人可以接受并优化此功能。我现在想不出另一种做法。
答案 1 :(得分:0)
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)
可以使用subselect或值得在两个查询中执行,因为系统上更轻。
答案 2 :(得分:0)
所以你想要加入这样的广告吗?
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%%')