我的情况: 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中的一个查询实现这一目标? 如果不可能,我如何通过最简单的查询实现这一目标?
答案 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
将始终存在,但如果不是这样,则可以重写