MySQL JOIN запрашивает больше таблиц и возвращает больше результатов за один выбор - PullRequest
1 голос
/ 12 января 2012

Я бы спросил, извините, мой плохой английский: (* ​​1001 *

У меня есть несколько таблиц

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;

Запрос:

SELECT user.*, prf.*, acl.*
FROM (SELECT * FROM user LIMIT 1) AS user
LEFT JOIN user_acl AS acl ON (acl.id_user = user.id)
INNER JOIN user_profil AS prf ON (user.id = prf.id)

У меня есть таблица user,user_acl, user_profil

таблица user и user_profil проиндексированы под id что такое общий ключ

Таблица user_acl имеет id_user общий ключ с таблицейuser (id) в таблице, но user_acl Для таблицы user больше строк, и мне нужны все строки из таблицы user_acl в одном запросе.

Ответы [ 2 ]

1 голос
/ 12 января 2012

Вы можете заставить MySQL объединить значения из нескольких строк в одну строку с GROUP_CONCAT:

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 голосов
/ 12 января 2012

Вы не можете.Вы должны разделить запрос, если вам нужно более одной строки acl на одну строку пользователя.[РЕДАКТИРОВАТЬ]: Но если вам нужно выполнить с одним запросом, то вы должны использовать некоторые побитовые операции.http://codingrecipes.com/how-to-write-a-permission-system-using-bits-and-bitwise-operations-in-php

...