Прошло некоторое время с тех пор, как мне нужна была помощь, но сегодня я здесь, чтобы в основном получить помощь от ваших знаний. В настоящее время я сильно зациклен на очень неприятной проблеме SQL, которая заключается в следующем.
У меня две таблицы. Painteditems, и specialitems. Обе таблицы имеют уникальные имена столбцов (paintitemid, specialitemid и т. Д.), Но обе таблицы имеют одинаковые значения. Я хочу получить результаты из обеих таблиц.
Скажем, это моя настройка:
PaintedItems
SpecialItems
Я использовал этот запрос:
SELECT * FROM `painteditems` AS pa, `specialitems` AS sp WHERE (pa.`visible` = 1 OR sp.`visible` = 1) AND (pa.`painteditemname` = 'itemname1' OR sp.`specialitemname` = 'itemname1') AND (pa.`painteditemcolor` = 'black' OR sp.`specialitemcolor` = 'black')
Это привело к:
Showing rows 0 - 29 ( 259,040 total, Query took 39.4352 sec)
хотя обе таблицы содержат всего 10.000 строк. Добавление этого ничего не делало:
GROUP BY pa.`painteditemid`, sp.`specialitemid`
Еще 260 тыс. Строк. Как мне подойти к этому?
Заранее спасибо.
изменить: фиксированный интервал, блоки кода
Уверенные звуки, как будто вы хотите UNION
между двумя таблицами. Прямо сейчас вы получаете декартовский продукт, поэтому результаты настолько велики:
select *, 'painted' Source from painteditems where visible = 1 and painteditemname = 'itemname1' and painteditemcolor = 'black' union all select *, 'special' Source from specialitems where visible = 1 and specialitemname = 'itemname1' and specialitemcolor = 'black'
Вам нужно будет заменить SELECT *
вашими именами столбцов. Также количество столбцов и типов данных должно совпадать в обоих запросах.
UNION ALL
вернет все строки из обеих таблиц, если вам нужны только строки DISTINCT
тогда вы захотите использовать UNION
Оператор UNION используется для объединения результирующего набора из двух или более операторов SELECT. Непосредственно Вы можете использовать UNION, как показано в @bluefeet's
Если вы встретите ниже условий.
Я бы сделал это с union all
в подзапросе:
select * from ((select paintedItemName as ItemName, paintedItemColor as ItemColor, visible, 'Painted' as which from painteditems ) union all (select specialItemName, SpecialItemColor, visible, 'Special' as which from specialitems ) ) t where visible = 1 and itemname = 'itemname1' and itemcolor = 'black'
Это позволяет получить только один набор результатов. В union
имена столбцов берутся из первого подзапроса, который переименовывается в более общие имена. Причина, по которой я предпочитаю этот подход, состоит в том, что предложение where
не нужно повторять несколько раз, что может привести к ошибкам и проблемам обслуживания.