需要MySQL的帮助,我认为这涉及自我加入

时间:2010-12-05 15:14:45

标签: mysql join

我有以下表格:

表:类别

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');

3 个答案:

答案 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)

  1. 所以你想要加入这样的广告吗?

    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%%') 
    
  2. 或者您是否还要包含Arkansas ItemCalifornia 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%%')