【问题标题】:How to search by joined table's word and get all the relative data from joined table by cakephp如何通过连接表的单词搜索并通过cakephp从连接表中获取所有相关数据
【发布时间】:2015-12-10 08:17:43
【问题描述】:

我的情况: 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”搜索标签时,我想获取属于 Italian_resto 的所有标签。换句话说,当我通过 'Italian' 搜索标签时,我想获得 restaurant_ids 均为 1 的 'Italian' 和 '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) {
        ["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 中的一个查询来实现? 如果不可能,我如何通过最简单的查询来实现?

【问题讨论】:

  • 基本上你想要一个mysql查询?我没有使用 cakephp 的经验。我可以给你一个mysql查询,它可以给你你想要的信息
  • @Sohaib 基本上是想要cakephp的代码,不过如果对cakephp不熟悉,也欢迎mysql查询。然后我将尝试弄清楚如何在 cakephp 中做到这一点。也欢迎对表结构的建议,因为目前这些表的结构是可变的
  • 你能清楚地定义你的输入吗?确切的查询是什么。 tag=Italian 是唯一提供的吗?
  • @Sohaib 是的,tag=Italian 是唯一提供的。
  • 如果标签=Italian 也出现在 resId 2 中怎么办?在这种情况下,期望的输出是什么?

标签: php mysql cakephp join


【解决方案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

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

【讨论】:

  • 真的。我将尝试您的代码并将其转换为 cakephp 代码。
  • @Sho 如果你觉得有用别忘了标记为正确:)
  • +1 我在我的情况下测试了这段代码。只要我看到结果,这段代码就可以正常工作。非常感谢!如果我设法将您的 sql 代码转换为 cakephp 代码,我会发布它。
【解决方案2】:

一种方法是从以下内容开始:

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 将始终存在,但如果不是这种情况,则可以重写

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多