Нужна помощь с MySQL, который, как я считаю, включает в себя самостоятельное соединение

0

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

ТАБЛИЦА: категория

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
    Ваша иерархия - максимум 2 уровня? Если нет, вы можете рассмотреть альтернативное представление. MySQL не имеет рекурсивных CTE.
  • 0
    Да. В идеале, Страна была бы в своем собственном столе, но создатель этой мысли, имея страны, штаты / провинции в одной таблице, может пойти дальше.
Теги:
join

3 ответа

1
Лучший ответ

* EDIT Я нашел более быстрый и лучший способ. Требуется один запрос.

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

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

  • 0
    Помимо всего, это, кажется, дает мне то, что мне нужно. Спасибо!
  • 0
    Мое недавнее редактирование должно исправить эту проблему.
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%%') 
    
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)

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

  • 0
    Ваш запрос не возвращает никаких результатов для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню