如何通过联接表的单词进行搜索,并通过cakephp

时间:2015-12-10 08:17:44

标签: php mysql cakephp join

我的情况: php 5.1.6 cakephp 1.3

我有一张餐厅餐桌,结构如下:

id       name        
1    Italian_resto
2    French_resto
3    Japanese_resto

我还有一个RestaurantsTag表,其结构如下所示。

id   restaurant_id  type       tag      
1         1         area     Firenze
2         1     genre    Italian
3         2         area     Paris
4         2         genre    French
5         3         area     Tokyo
6         3         genre    Japanese

这两个表可以通过Restaurant.id和RestaurantsTag.restaurant_id加入。 然后,当我通过"意大利语"搜索标签时,我想获得属于Italian_resto的所有标签。换句话说,当我用意大利语搜索标签时,我希望得到意大利语'和佛罗伦萨'其restaurant_ids均为1。我想要的结果是吼叫。

array(1) {
  [0]=>
  array(2) {
    ["Restaurant"]=>
    array(4) {
      ["id"]=>
      string(1) "1"
      ["name"]=>
      string(27) "Italian_resto"

    }
    ["RestaurantsTag"]=>
    array(2) {
      [0]=>
      array(2) {
        ["type"]=>
        string(5) "genre"
        ["tag"]=>
        string(12) "Italian"
      }
      [1]=>
      array(2) {
        ["type"]=>
        string(4) "area"
        ["tag"]=>
        string(6) "Firenze"
      }
    }
  }
}

欢迎结果如下:

array(1) {
  [0]=>
  array(2) {
    ["Restaurant"]=>
    array(4) {
      ["id"]=>
      string(1) "1"
      ["name"]=>
      string(27) "Italian_resto"

    }
    ["RestaurantsTag"]=>
    array(2) {
      [0]=>
      array(2) {
        ["type"]=>
        string(5) "genre"
        ["tag"]=>
        string(12) "Italian"
      }
    }
  }
  [1]=>
  array(2) {
    ["Restaurant"]=>
    array(4) {
      ["id"]=>
      string(1) "1"
      ["name"]=>
      string(27) "Italian_resto"

    }
    ["RestaurantsTag"]=>
    array(2) {
      [0]=>
      array(2) {
        ["type"]=>
        string(5) "area"
        ["tag"]=>
        string(12) "Firenze"
      }
    }
  }

}

如何通过cakephp 1.3中的一个查询实现这一目标? 如果不可能,我如何通过最简单的查询实现这一目标?

2 个答案:

答案 0 :(得分:1)

根据所需的输入和输出,这可能是你想要的。

SELECT rt.res_id, rt.`type`, rt.tag, r.res_name FROM
restaurants_tag rt
JOIN 
    (SELECT res_id FROM restaurants_tag WHERE tag="Italian") d 
ON d.res_id = rt.res_id 
JOIN restaurant r ON d.res_id = r.id;

|res_id |type   |tag        |res_name
|-------|-------|-----------|------------
|1      |area   |Firenze    |Italian_resto
|1      |genre  |Italian    |Italian_resto

如果这不是您想要的,请随意恢复。

答案 1 :(得分:0)

一种方法是从这样的事情开始:

SELECT a.restaurant_id
     , b.name
     , MAX(CASE WHEN a.type = 'area' THEN tag END) area
     , MAX(CASE WHEN a.type = 'genre' THEN tag END) genre 
  FROM restaurant_tags a 
  JOIN restaurants b 
    ON b.id = a.restaurant_id 
 GROUP 
    BY a.restaurant_id;

SELECT x.restaurant_id
     , x.tag area
     , y.tag genre 
  FROM restaurant_tags x 
  LEFT 
  JOIN restaurant_tags y 
    ON y.restaurant_id = x.restaurant_id 
   AND y.type = 'genre'
  JOIN restaurants r
    ON r.id = x.restaurant_id
 WHERE x.type = 'area';

此查询的此特定版本假定area将始终存在,但如果不是这样,则可以重写