我有下表:
表格:类别
catid catfatherid catname
1 0 United States
2 1 Arizona
3 1 Arkansas
4 1 California
和表格:广告
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');
最佳答案
*编辑我找到了一种更快更好的方法..需要一个查询..
为了澄清他上面的要求: “但是,我还需要能够按“美国”进行搜索,并显示广告表中具有 catid 且也具有该项目的 catfatherid 的所有条目。”
因此需要检查 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
上面的方法比我最初的尝试要好得多。它运行并且不会循环多次,而是循环并获取所有计数,而不需要执行额外的查询。这也将返回美国 child ,或者如果搜索一个州只会返回该州信息。
原始答案如下:
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 毫秒。 (我在亚利桑那州类别“广告表”中添加了几行额外的行)
希望这里的其他人可以接受并优化它。目前我想不出其他方法来做到这一点。
关于mysql - 需要有关 MySQL 的帮助,我认为该 MySQL 涉及自连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4359435/