У меня есть 3 таблицы:
-- ----------------------------
-- Table structure for computers
-- ----------------------------
DROP TABLE IF EXISTS `computers`;
CREATE TABLE `computers` (
`id_pc` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`case` int(11) NOT NULL,
`mobo` int(11) NOT NULL,
`cpu` int(11) NOT NULL,
`gpu` int(11) NOT NULL,
`psu` int(11) NOT NULL,
`ram` int(11) NOT NULL,
`ssd` int(11) NOT NULL,
`hdd` int(11) NOT NULL,
PRIMARY KEY (`id_pc`) USING BTREE,
INDEX `fk_case`(`case`) USING BTREE,
INDEX `fk_mobo`(`mobo`) USING BTREE,
INDEX `fk_cpu`(`cpu`) USING BTREE,
INDEX `fk_gpu`(`gpu`) USING BTREE,
INDEX `fk_psu`(`psu`) USING BTREE,
INDEX `fk_ram`(`ram`) USING BTREE,
INDEX `fk_ssd`(`ssd`) USING BTREE,
INDEX `fk_hdd`(`hdd`) USING BTREE,
CONSTRAINT `fk_case` FOREIGN KEY (`case`) REFERENCES `inventory` (`id_inventario`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk_cpu` FOREIGN KEY (`cpu`) REFERENCES `inventory` (`id_inventario`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk_gpu` FOREIGN KEY (`gpu`) REFERENCES `inventory` (`id_inventario`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk_hdd` FOREIGN KEY (`hdd`) REFERENCES `inventory` (`id_inventario`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk_mobo` FOREIGN KEY (`mobo`) REFERENCES `inventory` (`id_inventario`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk_psu` FOREIGN KEY (`psu`) REFERENCES `inventory` (`id_inventario`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk_ram` FOREIGN KEY (`ram`) REFERENCES `inventory` (`id_inventario`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk_ssd` FOREIGN KEY (`ssd`) REFERENCES `inventory` (`id_inventario`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for hardware_types
-- ----------------------------
DROP TABLE IF EXISTS `hardware_types`;
CREATE TABLE `hardware_types` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `id`(`id`) USING BTREE,
INDEX `id_2`(`id`, `type_name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for inventory
-- ----------------------------
DROP TABLE IF EXISTS `inventory`;
CREATE TABLE `inventory` (
`id_inventario` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`tipo` int(255) NOT NULL,
`modelo` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`serial_number` int(11) NOT NULL,
PRIMARY KEY (`id_inventario`) USING BTREE,
INDEX `fk_tipo`(`tipo`) USING BTREE,
CONSTRAINT `fk_tipo` FOREIGN KEY (`tipo`) REFERENCES `hardware_types` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
В моей программе на C# мне нужно получить DataGridView с содержимым таблицы «компьютеры», но некоторые поля являются внешними ключами, а данные находятся в таблице «инвентаризации», как я могу создать запрос для возврата имени на основе идентификатора на каждое поле?
Пример:
На компьютерном столе у меня есть компьютер с идентификатором процессора 1 и идентификатором графического процессора 2, как я могу вернуть каждое поле, но вместо идентификатора я получаю имя?
Я уже пытался что-то делать с помощью INNER JOIN, но безуспешно.
Пример, который я пробовал, всегда возвращает пустой:
SELECT c.*, i.nome AS item_name
FROM
computers AS c
INNER JOIN inventory AS i ON i.id_inventario = c.caixa AND i.id_inventario = c.mobo AND i.id_inventario = c.cpu AND i.id_inventario = c.gpu AND i.id_inventario = c.psu AND i.id_inventario = c.ram AND i.id_inventario = c.ssd AND i.id_inventario = c.hdd
Таблица данных о компьютерах:
id_pc nome case mobo cpu gpu psu ram ssd hdd
1 Teste213 1 2 1 1 1 2 2 2
Данные инвентарной таблицы:
id_inventario nome tipo modelo serial_number
1 Teste 0 teste 123
2 Teste2 1 1testesa 1234
Мне нужно получить столбец «nome» при получении всех строк в столбце компьютеров, например:
id_pc nome case mobo cpu gpu psu ram ssd hdd
1 Teste213 Teste Teste2 Teste Teste Teste Teste2 Teste2 Teste2
Вы выполняете внутреннее соединение между c и i и говорите, что id_inventario в таблице i должен соответствовать 8 различным вещам. Почему вы ожидаете, что он что-нибудь вернет?
Теперь я добавил OR, и он возвращается, но возвращает только один раз item_name, и мне нужно вернуть имя в каждом столбце, я никогда не делал ничего подобного, только несколько основных примеров ...
Обновите свой вопрос, указав исправленный запрос, образец данных в каждой таблице и ожидаемый результат вашего запроса с учетом этого образца.
@AdamV добавил образец





Вам нужно несколько JOIN, по 1 для каждого столбца:
SELECT c.id_pc, c.nome, i1.nome AS 'case', i2.nome AS 'mobo'
FROM computers AS c
INNER JOIN inventory AS i1
ON i1.id_inventario = c.case
INNER JOIN inventory AS i2
ON i2.id_inventario = c.mobo
INNER JOIN ...
Если вы предпочитаете, вместо использования i1, i2, вы можете назвать разные inventory JOINS, чтобы их было легче различать (AS 'iCaixa', AS 'iMobo' и т. д.).
Я получил запрос, работающий непосредственно с mysql, но когда я пытаюсь использовать запрос на C#, он вылетает: Unknown column 'c.id_pc' in 'field list' Я получаю эту ошибку на: MySqlDataReader dataReader = cmd.ExecuteReader();
Получилось, я нырял по линиям, и в конце я не дал места, все складывалось вместе ... prntscr.com/jmk89y Спасибо за вашу помощь
На самом деле, я этого не делал, и я уже делал это в других проектах, но не с таким количеством полей, и я не знаю, вот пример, который я сделал:
SELECT c.*, i.nome AS item_name FROM computers AS c INNER JOIN inventory AS i ON i.id_inventario = c.caixa AND i.id_inventario = c.mobo AND i.id_inventario = c.cpu AND i.id_inventario = c.gpu AND i.id_inventario = c.psu AND i.id_inventario = c.ram AND i.id_inventario = c.ssd AND i.id_inventario = c.hddОн всегда возвращает пустой, и я не знаю Зачем...