おそらく簡単な解決策があるので少し恥ずかしい思いをしますが、それを行うのに十分なMySQLを知りません。1つのクエリを使用してこれらの各テーブルからデータを取得し、次に示すように配列を返すにはどうすればよいですか?私が試みるたびに、1つのタグを返すか、同じタスクの複数の配列を返します。それぞれに異なるタグが付いています。
クエリ構造はどのようになりますか?
ありがとう!
おそらく簡単な解決策があるので少し恥ずかしい思いをしますが、それを行うのに十分なMySQLを知りません。1つのクエリを使用してこれらの各テーブルからデータを取得し、次に示すように配列を返すにはどうすればよいですか?私が試みるたびに、1つのタグを返すか、同じタスクの複数の配列を返します。それぞれに異なるタグが付いています。
クエリ構造はどのようになりますか?
ありがとう!
画像の配列は、実際には、1 回ではなく 2 回のクエリの後でデータがどのように見えるかを示しています。データがそれほど複雑ではないため、単一のクエリで実行できるようにするには、 を使用しGROUP_CONCAT()
てタスクのすべてのタグを取得し、クエリ後のロジックを使用してデータを個別の配列に分割します。
要求されたすべてのデータを取得するための SQL クエリは次のようになります。
SELECT
tasks.*, GROUP_CONCAT(tag_name) AS tags
FROM
tasks LEFT JOIN tags ON tags.task_id=tags.id
WHERE
id=2
このクエリは単一のレコードを返します。そのレコードの列tags
には、タスクに属するすべてのタグのカンマ区切りのリストが保持されます。その列のデータを配列に分割して、目的の構造を構築できます。
PHP を使用した例:
$result = mysql_query("SELECT tasks.*, GROUP_CONCAT(tag_name) AS tags FROM tasks LEFT JOIN tags ON tags.task_id=tags.id WHERE id=2");
// create the "$task" array that has a "task" and "tags" index
$task = array('task' => array(), 'tags' => array());
$task['task'] = mysql_fetch_assoc($result);
// split the comma-separated list of tags into an array
$task['tags'] = explode(',', $task['task']['tags']);
// delete the original "tags" entry that's returned by the sql query
unset($task['task']['tags']);
この例には、データ検証、接続情報、またはその他のロジックが含まれていないことに注意してください。データを目的の構造に分割する方法の大まかなアイデアとして使用する必要があります。