Получите номер как имя с помощью INNER JOIN

У меня есть 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

На самом деле, я этого не делал, и я уже делал это в других проектах, но не с таким количеством полей, и я не знаю, вот пример, который я сделал: 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 Он всегда возвращает пустой, и я не знаю Зачем...

Karbust 25.05.2018 16:52

Вы выполняете внутреннее соединение между c и i и говорите, что id_inventario в таблице i должен соответствовать 8 различным вещам. Почему вы ожидаете, что он что-нибудь вернет?

Adam V 25.05.2018 16:58

Теперь я добавил OR, и он возвращается, но возвращает только один раз item_name, и мне нужно вернуть имя в каждом столбце, я никогда не делал ничего подобного, только несколько основных примеров ...

Karbust 25.05.2018 17:06

Обновите свой вопрос, указав исправленный запрос, образец данных в каждой таблице и ожидаемый результат вашего запроса с учетом этого образца.

Adam V 25.05.2018 17:10

@AdamV добавил образец

Karbust 25.05.2018 17:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно несколько 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 ...

Посмотрите здесь SQLFiddle.

Если вы предпочитаете, вместо использования i1, i2, вы можете назвать разные inventory JOINS, чтобы их было легче различать (AS 'iCaixa', AS 'iMobo' и т. д.).

Я получил запрос, работающий непосредственно с mysql, но когда я пытаюсь использовать запрос на C#, он вылетает: Unknown column 'c.id_pc' in 'field list' Я получаю эту ошибку на: MySqlDataReader dataReader = cmd.ExecuteReader();

Karbust 25.05.2018 17:44

Получилось, я нырял по линиям, и в конце я не дал места, все складывалось вместе ... prntscr.com/jmk89y Спасибо за вашу помощь

Karbust 25.05.2018 17:50

Другие вопросы по теме