Добрый день. У меня ошибка: "используемые операторы select имеют разное количество столбцов mysql"
Мой запрос
SELECT
* FROM
inventory
WHERE
barcode1 = 'DR963560860GYYQBKBBD2'
OR barcode2 = 'DR963560860GYYQBKBBD2'
OR barcode3 = 'DR963560860GYYQBKBBD2'
OR barcode4 = 'DR963560860GYYQBKBBD2' UNION
SELECT
p.id AS 'PartId',
m.'Name' AS 'Model',
c.'Name' AS 'Color',
pt.'Name' AS 'PartType'
FROM
inventory i
JOIN part p ON p.Id = i.PartId
JOIN model m ON m.Id = p.ModelId
JOIN color c ON c.Id = p.ColorId
JOIN parttype pt ON pt.Id = p.PartTypeId
WHERE
barcode1 = @barcode
OR barcode2 = @barcode
OR barcode3 = 'DR963560860GYYQBKBBD2'
OR barcode4 = 'DR963560860GYYQBKBBD2';
То, что я хочу получить, - это все данные в таблице инвентаризации в первом операторе select, а другой - в другой таблице.
Раньше у меня было два запроса, которые
SELECT
*
FROM
inventory
WHERE
barcode1 = @Barcode
OR barcode2 = @Barcode
OR barcode3 = @Barcode
OR barcode4 = @Barcode'
который будет извлекать всю информацию в инвентаре, а другой -
SELECT
p.id AS 'PartId',
m.'Name' AS 'Model',
c.'Name' AS 'Color',
pt.'Name' AS 'PartType'
FROM
inventory i
JOIN part p ON p.Id = i.PartId
JOIN model m ON m.Id = p.ModelId
JOIN color c ON c.Id = p.ColorId
JOIN parttype pt ON pt.Id = p.PartTypeId
WHERE
barcode1 = @Barcode
OR barcode2 = @Barcode
OR barcode3 = @Barcode
OR barcode4 = @Barcode
Это будет загружать только четыре столбца.
Поскольку моя загрузка слишком медленная, я объединю ее в один запрос. Это возможно? Как я могу это сделать?
Я новичок в mysql, и я очень благодарен, если вы мне поможете.
Благодарю вас и безбожников.
Я не понимаю, почему вы используете объединение (например, вертикальное слияние), когда объединение (горизонтальное слияние) будет казаться более подходящим
SELECT i.*,
p.id AS 'PartId',
m.'Name' AS 'Model',
c.'Name' AS 'Color',
pt.'Name' AS 'PartType'
FROM
inventory i
JOIN part p ON p.Id = i.PartId
JOIN model m ON m.Id = p.ModelId
JOIN color c ON c.Id = p.ColorId
JOIN parttype pt ON pt.Id = p.PartTypeId
WHERE
barcode1 = @Barcode
OR barcode2 = @Barcode
OR barcode3 = @Barcode
OR barcode4 = @Barcode
Проблема заключается в том, что вы используете Union
на двух таблицах с различным количеством столбцов. Например, если вы получаете что-то в TableA:
| Id | Name | Age|
+----+------+----+
| 1 | Andy | 3 |
И еще один TableB
| Id | Name | Age| Gender |
+----+------+----+--------|
| 1 | Andy | 3 | Male |
Если вы попытаетесь объединить их, вы получите ошибку, поскольку они не могут быть объединены (из-за разного количества столбцов).
Поэтому ваша проблема в том, что ваш первый Select *...
возвращает больше столбцов, чем второй, выберите, где вы выбираете только 4 столбца. Ключом к его решению является указание точных столбцов, которые нужно выбрать, чтобы оба выбора имели одинаковое количество столбцов.
Что-то вроде этого
SELECT
p.id AS 'PartId',
m.'Name' AS 'Model',
c.'Name' AS 'Color',
pt.'Name' AS 'PartType'
FROM
inventory i
JOIN part p ON p.Id = i.PartId
JOIN model m ON m.Id = p.ModelId
JOIN color c ON c.Id = p.ColorId
JOIN parttype pt ON pt.Id = p.PartTypeId
WHERE
i.barcode1 = 'DR963560860GYYQBKBBD2'
OR i.barcode2 = 'DR963560860GYYQBKBBD2'
OR i.barcode3 = 'DR963560860GYYQBKBBD2'
OR i.barcode4 = 'DR963560860GYYQBKBBD2'
UNION
SELECT
p.id AS 'PartId',
m.'Name' AS 'Model',
c.'Name' AS 'Color',
pt.'Name' AS 'PartType'
FROM
inventory i
JOIN part p ON p.Id = i.PartId
JOIN model m ON m.Id = p.ModelId
JOIN color c ON c.Id = p.ColorId
JOIN parttype pt ON pt.Id = p.PartTypeId
WHERE
barcode1 = @barcode
OR barcode2 = @barcode
OR barcode3 = 'DR963560860GYYQBKBBD2'
OR barcode4 = 'DR963560860GYYQBKBBD2';