SQL LEFT JOIN - 合并具有相同 ID 的数组
SQL LEFT JOIN - Combine arrays with the same id
我正在编写一个具有多个 LEFT JOIN 的 MySQL 查询(使用 laravel 查询生成器)。结果我得到的数组看起来像:
array:4 [▼
0 => {#322 ▼
+"id": 19
+"thing_id": 7
+"title": "new translate"
+"locale": "en"
+"thing_sub_cat_id": 19
+"name": "WINTER"
}
1 => {#323 ▼
+"id": 24
+"thing_id": 7
+"title": "new translate"
+"locale": "en"
+"thing_sub_cat_id": 24
+"name": "DIVING"
}
2 => {#324 ▼
+"id": 37
+"thing_id": 15
+"title": "thing to do"
+"locale": "en"
+"thing_sub_cat_id": 37
+"name": "LATEST HAPPENINGS"
}
3 => {#325 ▼
+"id": 21
+"thing_id": 2
+"title": "Main page"
+"locale": null
+"thing_sub_cat_id": null
+"name": null
}
]
查询生成器:
DB::table('things_translations')
->leftjoin('things_sub_cat_rel', 'things_sub_cat_rel.thing_id', '=', 'things_translations.thing_id')
->leftjoin('things_sub_cat_translations', 'things_sub_cat_rel.thing_sub_cat_id', '=', 'things_sub_cat_translations.thing_sub_cat_id')
->where('things_translations.locale', '=', 'en')
->get();
locale
列与 laravel-translatable 包关联。我正在尝试获取具有 locale=en
的所有数据库行。我会使用 laravel eloquent 但我得到了 unknown column locale
所以我尝试了上面的查询构建器。
关联模型:
ThingTranslation
与 ThingSubCat
有 belongsToMany 关系。例如,假设我有 3 个表,1 个用于文章,1 个用于类别,1 个用于具有文章 ID 和类别 ID 的关系。
我想知道合并具有相同 "thing_id" 的数组的更好方法。例如上面我有两个带有 thing_id 的数组: 7. 我可以使用 mysql 将这两个数组合并为一个数组并且 "name" 有多个数组吗?
我认为你应该像这样在 mysql 中使用 GROUP_CONCAT
函数 :
SELECT tbl.*,
GROUP_CONCAT(`name` SEPERATOR ',') as `name_combined`
FROM
(
SELECT * FROM things_translations
LEFT JOIN things_sub_cat_rel ON things_sub_cat_rel.thing_id = things_translations.thing_id
LEFT JOIN things_sub_cat_translations ON things_sub_cat_rel.thing_sub_cat_id = things_sub_cat_translations.thing_sub_cat_id
WHERE things_translations.locale = 'en'
) tbl
GROUP BY things_id;
使用这样的查询,您可以将 name
行中的 thing_id
相似的行合并为一行。
语法参考:
http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
*如果有人对laravel有同样的问题,他可以看看我下面的回答。如果有人有类似的问题,他可以尝试 Ramin Omrani 的答案中的查询。效果很好。
我找到了 laravel eloquent 的解决方案。问题是因为我正在使用 laravel-translatable 包。获取具有 locale = "en" 的行的唯一方法是使用 whereHas
translations
然后使用 where 子句,如以下代码:
$getThing = Thing::with('subCategories')->whereHas('translations', function ($query) {
$query->where('locale', '=', 'en');
})->get();
我正在编写一个具有多个 LEFT JOIN 的 MySQL 查询(使用 laravel 查询生成器)。结果我得到的数组看起来像:
array:4 [▼
0 => {#322 ▼
+"id": 19
+"thing_id": 7
+"title": "new translate"
+"locale": "en"
+"thing_sub_cat_id": 19
+"name": "WINTER"
}
1 => {#323 ▼
+"id": 24
+"thing_id": 7
+"title": "new translate"
+"locale": "en"
+"thing_sub_cat_id": 24
+"name": "DIVING"
}
2 => {#324 ▼
+"id": 37
+"thing_id": 15
+"title": "thing to do"
+"locale": "en"
+"thing_sub_cat_id": 37
+"name": "LATEST HAPPENINGS"
}
3 => {#325 ▼
+"id": 21
+"thing_id": 2
+"title": "Main page"
+"locale": null
+"thing_sub_cat_id": null
+"name": null
}
]
查询生成器:
DB::table('things_translations')
->leftjoin('things_sub_cat_rel', 'things_sub_cat_rel.thing_id', '=', 'things_translations.thing_id')
->leftjoin('things_sub_cat_translations', 'things_sub_cat_rel.thing_sub_cat_id', '=', 'things_sub_cat_translations.thing_sub_cat_id')
->where('things_translations.locale', '=', 'en')
->get();
locale
列与 laravel-translatable 包关联。我正在尝试获取具有 locale=en
的所有数据库行。我会使用 laravel eloquent 但我得到了 unknown column locale
所以我尝试了上面的查询构建器。
关联模型:
ThingTranslation
与 ThingSubCat
有 belongsToMany 关系。例如,假设我有 3 个表,1 个用于文章,1 个用于类别,1 个用于具有文章 ID 和类别 ID 的关系。
我想知道合并具有相同 "thing_id" 的数组的更好方法。例如上面我有两个带有 thing_id 的数组: 7. 我可以使用 mysql 将这两个数组合并为一个数组并且 "name" 有多个数组吗?
我认为你应该像这样在 mysql 中使用 GROUP_CONCAT
函数 :
SELECT tbl.*,
GROUP_CONCAT(`name` SEPERATOR ',') as `name_combined`
FROM
(
SELECT * FROM things_translations
LEFT JOIN things_sub_cat_rel ON things_sub_cat_rel.thing_id = things_translations.thing_id
LEFT JOIN things_sub_cat_translations ON things_sub_cat_rel.thing_sub_cat_id = things_sub_cat_translations.thing_sub_cat_id
WHERE things_translations.locale = 'en'
) tbl
GROUP BY things_id;
使用这样的查询,您可以将 name
行中的 thing_id
相似的行合并为一行。
语法参考:
http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
*如果有人对laravel有同样的问题,他可以看看我下面的回答。如果有人有类似的问题,他可以尝试 Ramin Omrani 的答案中的查询。效果很好。
我找到了 laravel eloquent 的解决方案。问题是因为我正在使用 laravel-translatable 包。获取具有 locale = "en" 的行的唯一方法是使用 whereHas
translations
然后使用 where 子句,如以下代码:
$getThing = Thing::with('subCategories')->whereHas('translations', function ($query) {
$query->where('locale', '=', 'en');
})->get();