0
CREATE TABLE IF NOT EXISTS `site_location` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `level` int(11) NOT NULL,
  `lft` int(11) NOT NULL,
  `rgt` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

///DATA
    INSERT INTO `site_location` (`id`, `level`, `lft`, `rgt`, `name`) VALUES
    (1, 0, 1, 24, 'United Kingdom'),
    (2, 1, 2, 19, 'London'),
    (3, 2, 13, 14, 'Central London'),
    (4, 2, 11, 12, 'East London'),
    (5, 2, 9, 10, 'North London'),
    (6, 2, 7, 8, 'North West London'),
    (7, 2, 5, 6, 'South East London'),
    (8, 2, 3, 4, 'West London'),
    (9, 2, 15, 18, 'South West'),
    (10, 3, 16, 17, 'Battersea'),
    (11, 1, 20, 23, 'Brighton'),
    (12, 2, 21, 22, 'Guildford');

CREATE TABLE IF NOT EXISTS `ads` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `category_id` int(11) NOT NULL,
  `location` int(11) NOT NULL,
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`,`category_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `ads` (`id`, `category_id`, `location`, `title`) VALUES
(1, 7, 10, 'Test1'),
(2, 9, 3, 'Test2'),
(3, 12, 10, 'Test3'),
(4, 13, 4, 'Test4');

ID が ID=1 の場合、このように戻ります

[ United Kingdom(4) ]
    London(4)     
    Brighton(0)

IDがID=2の場合

    United Kingdom(4)
      [ London(4) ]
        South West(2)
        Central London(1)
        East London(1)
      Brighton(0)

したがって、「ロンドン」が選択された場合、そのすべての兄弟とすべての子が必要です

同じ「南西」が選択されている場合、すべての兄弟、すべての子、その親、すべての親兄弟が必要です

    United Kingdom(4)
      London(4)
        [ South West(2) ]
          Battersea(2)
        Central London(1)
        East London(1)
      Brighton(0)

また、その場所にある広告の数。たとえば、英国ではテーブル内のすべての広告が 4 であるため 4 である必要があり、バタシーでは 2 であるため南西部では 2 である必要があります。

idが11のとき

United Kingdom(4)
  London(4)
  [ Brighton(0) ]
      Guildford(0)

クエリがあります: South West lft:15, rgt:18, level:2

 SELECT 
    node.id, 
    node.alias, 
    node.level, 
    node.name, 
    COUNT(ads.id) as ads,
    IF(node.lft = node.rgt-1, "0", "1") AS `has_children`
 FROM 
    site_location AS parent LEFT JOIN
    ads as ads ON (parent.id = ads.location),
    site_location AS node
 WHERE
    parent.lft BETWEEN node.lft AND node.rgt
 AND 
    parent.lft BETWEEN 15 AND 18
 AND 
    node.level > 0
 AND
   node.level < 2 + 3
 GROUP BY node.id
 ORDER BY node.lft

これは戻ります

 London(4)
  South West(2)
   Battersea(2)

私はこのようにする必要があります

 London(4)
  South West(2)
   Battersea(2)
 Brighton(0) 

単一のクエリでこれを行うことは可能ですか:? 誰かが助けてくれれば、それは素晴らしいことです。前もって感謝します!

4

0 に答える 0