mysql - 需要有关 MySQL 的帮助,我认为该 MySQL 涉及自连接

标签 mysql join

我有下表:

表格:类别

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/

相关文章:

Mysql查询从表中获取客户数量

mysql:字谜查询以提取带有任何字母的每个可能的单词

MySQL检测大小写?

MySQL JOIN UNION 的结果

javascript - 如何使 <input> 显示 *** 而不是纯文本

SQL选择连接: is it possible to prefix all columns as 'prefix.*' ?

mysql - mysql多次批量更新操作死锁

javascript - 微服务架构和MySQL数据库分页

mysql - 在 MySQL 中设计数据库时的最佳实践

php - 基于 MySQL Inner Join 的查询给出重复的结果