Вот как я могу это сделать на примере сценария базы данных и запроса:
Создать / загрузить таблицу пользователей - использование суррогатного первичного ключа вместо имени пользователя, поскольку запросы к INT будут выполняться быстрее и они могут измениться.
CREATE TABLE users (
id int(11) AUTO_INCREMENT NOT NULL,
username varchar(255) NOT NULL,
gender char(1) NULL,
PRIMARY KEY(id)
) ENGINE = MyISAM AUTO_INCREMENT = 3
Загрузка пользователей
INSERT INTO users(id, username, gender)
VALUES(1, 'john', NULL)
GO
INSERT INTO users(id, username, gender)
VALUES(2, 'jane', NULL)
GO
Создание растений
CREATE TABLE plants (
id int(11) AUTO_INCREMENT NOT NULL,
name varchar(200) NOT NULL,
PRIMARY KEY(id)
) ENGINE = MyISAM AUTO_INCREMENT = 6
Грузовые установки
INSERT INTO plants(id, name)
VALUES(1, 'fern1')
GO
INSERT INTO plants(id, name)
VALUES(2, 'fern2')
GO
INSERT INTO plants(id, name)
VALUES(3, 'orchid1')
GO
INSERT INTO plants(id, name)
VALUES(4, 'orchid2')
GO
INSERT INTO plants(id, name)
VALUES(5, 'lilly1')
Создать таблицу соединения Я использую здесь суррогатный первичный ключ, так как многие веб-платформы не будут корректно обновлять таблицу соединения с первичным столбцом из 2 столбцов. Кроме того, я заканчивал тем, что довольно часто добавлял метаданные / детали к этим типам объединений, и без этого становится грязно. Примечание. Я не ограничиваю комбинацию одного и того же пользователя, добавляя тот же тип установки, но вы можете легко.
CREATE TABLE plants_users (
id int(11) AUTO_INCREMENT NOT NULL,
plant_id int(11) NOT NULL,
user_id int(11) NOT NULL,
PRIMARY KEY(id)
)
ENGINE = MyISAM
AUTO_INCREMENT = 8
GO
CREATE INDEX fk_plant_id USING BTREE
ON plants_users(plant_id)
GO
CREATE INDEX fk_user_id USING BTREE
ON plants_users(user_id)
Загрузить таблицу соединений
INSERT INTO plants_users(id, plant_id, user_id)
VALUES(1, 1, 1)
GO
INSERT INTO plants_users(id, plant_id, user_id)
VALUES(2, 2, 1)
GO
INSERT INTO plants_users(id, plant_id, user_id)
VALUES(3, 3, 1)
GO
INSERT INTO plants_users(id, plant_id, user_id)
VALUES(4, 4, 1)
GO
INSERT INTO plants_users(id, plant_id, user_id)
VALUES(5, 2, 2)
GO
INSERT INTO plants_users(id, plant_id, user_id)
VALUES(6, 3, 2)
GO
INSERT INTO plants_users(id, plant_id, user_id)
VALUES(7, 5, 2)
Окончательный запрос:
select
users.username,
plants.name
from
users,plants,plants_users
where
users.id = plants_users.user_id and
plants.id = plants_users.plant_id
Результат:
user name
john fern1
john fern2
john orchid1
john orchid2
jane fern2
jane orchid1
jane lilly1