2012-01-11 5 views
1

、申し訳ありません私の悪い英語:(MySQLはより多くの1つの選択私は疑問だろう

私が持っている複数のテーブル

CREATE TABLE `user` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `username` varchar(50) COLLATE utf8_slovak_ci NOT NULL, 
    `password` varchar(200) COLLATE utf8_slovak_ci NOT NULL, 
    `status` tinyint(1) NOT NULL, 
    PRIMARY KEY (`id`,`username`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci; 


CREATE TABLE `user_acl` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `id_user` int(11) unsigned NOT NULL, 
    `group` smallint(5) unsigned NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci; 


CREATE TABLE `user_profil` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `email` varchar(100) COLLATE utf8_slovak_ci NOT NULL, 
    `fullname` varchar(100) COLLATE utf8_slovak_ci NOT NULL, 
    `profil` text COLLATE utf8_slovak_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci; 

クエリの結果クエリの複数のテーブルをJOINと返しますテーブルを有するuser,user_acl,user_profil

tことはuseruser_profilは、共通鍵

user_aclがテーブルにテーブルuser(ID)とid_user共通鍵を持っていますが、user_aclあり以上の行がテーブルuserのためのものであると私はテーブルからすべての行を必要としているものidの下でインデックス化されています1つのクエリでuser_acl

+0

私はこれをテストし、動作するように見えたので、私は、私は理解していません。 – Umbrella

+0

'user_acl'の行があるかどうかに応じて、ただ1行だけ返されたクエリを返す必要があります –

+0

すべての' acl'行を1行に表示したいのですか? – Umbrella

答えて

1

あなたは、MySQLがGROUP_CONCATで1行に複数の行から値を結合するために得ることができます。

SELECT user.*, prf.*, GROUP_CONCAT(acl.id), GROUP_CONCAT(acl.group) 
FROM user 
LEFT JOIN user_acl AS acl ON (acl.id_user = user.id) 
INNER JOIN user_profil AS prf ON (user.id = prf.id) 
GROUP BY user.id; 
+0

ええ、ありがとうございました。これは本当に私を助け、私は別の重要なコマンドを学びました。もう一度、ありがとう:) –

関連する問題