Intereting Posts

MySQL – выбор из нескольких таблиц, возможно без объединения?

Прошло некоторое время с тех пор, как мне нужна была помощь, но сегодня я здесь, чтобы в основном получить помощь от ваших знаний. В настоящее время я сильно зациклен на очень неприятной проблеме SQL, которая заключается в следующем.

У меня две таблицы. Painteditems, и specialitems. Обе таблицы имеют уникальные имена столбцов (paintitemid, specialitemid и т. Д.), Но обе таблицы имеют одинаковые значения. Я хочу получить результаты из обеих таблиц.

Скажем, это моя настройка:

PaintedItems

  • paintedItemName
  • paintedItemColor
  • видимый

SpecialItems

  • specialItemName
  • specialItemColor
  • видимый

Я использовал этот запрос:

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 Если вы встретите ниже условий.

  • Оператор SELECT в UNION должен иметь одинаковое количество столбцов
  • Столбцы также должны иметь аналогичный тип данных
  • Столбцы в каждой инструкции SELECT должны быть в том же порядке.

Я бы сделал это с 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 не нужно повторять несколько раз, что может привести к ошибкам и проблемам обслуживания.