Нужна помощь с MySQL, который, как я считаю, включает в себя самостоятельное соединение - PullRequest
0 голосов
/ 05 декабря 2010

У меня есть следующие таблицы:

TABLE: категория

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%%'

Однако мне также нужно иметь возможность поиска по "Соединенным Штатам" и иметь все записи в таблице объявлений, которые имеют катидон, который также имееттакже появляется 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 ]

1 голос
/ 10 декабря 2010

* РЕДАКТИРОВАТЬ Я нашел более быстрый и лучший способ .. Требуется один запрос ..

Чтобы уточнить, какой запрос он имел выше: «Однако мне также нужно иметь возможность поиска по« Соединенным Штатам »и ​​иметь все записи в таблице объявлений, в которых есть катида, у которой также есть 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 мс на этом небольшом кусочке данных. (Я добавил пару дополнительных строк в Аризонскую категорию «таблица объявлений»)

Надеюсь, кто-то еще здесь может взять это и оптимизировать это. Я не могу придумать другого способа сделать это сейчас.

0 голосов
/ 06 декабря 2010
  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 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%%') 
    
0 голосов
/ 05 декабря 2010
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)

Может работать с подвыбором или стоить делать в двух запросах, как это было бы легче в системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...