は、あなたが望む結果を得るためにprofile_skills
とskills
テーブルを再参加することができます。
| p.id | p.name | s.id | s.skill |
---------------------------------------------
| 1 | rasmus | 1 | PHP |
| 1 | rasmus | 2 | Linux |
| 2 | thomas | 1 | PHP |
| 2 | thomas | 3 | Eating Sandwiches |
は、スキルのリストを1行の各プロファイルを取得するためのさまざまな方法があります。
SELECT p.*, s2.*
FROM skills s1
INNER JOIN profile_skills ps1 ON s.skill_id = ps1.skill_id
INNER JOIN profiles p ON ps1.profil_id = p.profil_id
INNER JOIN profile_skills ps2 ON p.profil_id = ps2.profil_id
INNER JOIN skills s2 ON ps2.skill_id = s2.skill_id
WHERE s1.skill = 'PHP'
これはあなたにこのような結果を得ることができます。 1つの方法はMySQLでGROUP_CONCAT
です。
SELECT p.profil_id, p.profile_name, GROUP_CONCAT(s2.skill) AS skills
FROM skills s1
INNER JOIN profile_skills ps1 ON s.skill_id = ps1.skill_id
INNER JOIN profiles p ON ps1.profil_id = p.profil_id
INNER JOIN profile_skills ps2 ON p.profil_id = ps2.profil_id
INNER JOIN skills s2 ON ps2.skill_id = s2.skill_id
WHERE s1.skill = 'PHP'
GROUP BY p.profil_id
私はあなたの列が実際にあるかわからない、とあなたは他のものを追加、あるいはまだp.*
を使用することができるので、例えば列を追加しました。技術的にはprofile
の他の列はGROUP BY p.profil_id
で定義されておらず、一般的にはグループ化や集約関数に含まれていない列は選択しないでください。の場合はこれは、すべて同じ行の同じ値を持つため、同じp.profil_id
です。
もう一つの方法は、単に最初のクエリを使用してPHPでグループ化を行うことです。
$previous_id = null;
while ($row = some_fetch_method()) {
if ($row['profil_id'] != $previous_id) {
echo "<h3>$row[profile_name]</h3>";
}
echo "<div>$row[skill]</div>";
}
明らかHTMLは非常にあなたが必要なもの、一般的な考え方を示すために十分であるべきではありません。
なぜgroup by ??? – scaisEdge
GROUP BYとSELECT *を行うことはできませんが、私はエラーが出なかったことに驚いています。 – Forbs
あなたはskill = 'PHP'なので、このスキルに関連するデータだけを取得します。 – scaisEdge