2014-12-31 5 views
0
SELECT id, 
(SELECT payer_id FROM transactions WHERE id = user_id), 
(SELECT sentence FROM cofg_sentences WHERE id = user_id), 
(SELECT name FROM cofg_options WHERE id = user_id), 
(SELECT hour FROM cofg_time WHERE id = user_id), 
(SELECT field_id, url FROM cofg_feeds WHERE id = user_id), 
(SELECT field_id, fb_user FROM cofg_accounts WHERE id = user_id) 
FROM users WHERE token = '.......' 

Я пытаюсь сделать этот запрос, но я получаю эту ошибку:MySQL выбрать несколько столбцов нескольких таблиц одновременно без использования РЕГИСТРИРУЙТЕСЬ

#1241 - Operand should contain 1 column(s) 

Если удалить второй столбец подзапроса я получаю :

#1242 - Subquery returns more than 1 row 

Я знаю, что есть другие вопросы с одинаковой ошибкой, но запросы разные. Я не хочу использовать JOIN, потому что я прочитал, что это уменьшит производительность.

В чем проблема? Любой вид помощи ценится :)

Заранее спасибо

+0

Скажите, пожалуйста, кто сказал, что 'JOIN' уменьшит количество выступлений, чтобы мы могли нанести ему камни. Выполнение 'JOIN' - это суть РСУБД. – RandomSeed

+0

@RandomSeed Я прочитал сообщение вроде этого: stackoverflow.com/a/1002612/2528167 сказал, что есть несколько случаев, когда подзапросы лучше, например, когда вам нужно присоединиться ко многим таблицам, как я, но я вижу, что мне нужно будет использовать Присоединяйтесь к моей цели. Спасибо –

+0

Хорошо, в некоторых случаях преобразование JOIN в подзапрос может * улучшить * производительность, но это очень пограничный случай, на мой взгляд (12 таблиц, соединенных? Все, что вам нужно делать, иногда немного увеличивает некоторые буферы). Кроме того, вы смотрите на 4-летнюю должность; с тех пор все изменилось. В любом случае, это прекрасный пример преждевременной оптимизации. Пойдите с JOIN в целом, только настройте запросы, которые имеют реальную производительность. – RandomSeed

ответ

0

я не хочу использовать JOIN, потому что я прочитал это уменьшит perfomance`

Что вы нашли, когда вы измерили его?

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

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

#1241 - Operand should contain 1 column(s) 

вызвано

(SELECT field_id, url FROM 

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

#1242 - Subquery returns more than 1 row 

Должно быть само собой разумеющимся и решаться путем объединения строк или ограничения на один ряд.

+0

Я прочитал это сообщение: http://stackoverflow.com/a/1002612/2528167 По вашему мнению, могу ли я эффективно возвратить несколько столбцов с несколькими рядами нескольких таблиц, используя INNER JOIN? Спасибо –

+1

Это зависит от длины вашей таблицы и того, как проиндексирована ваша база данных. Производительность подзапросов обычно хуже, чем JOINS, но зависит от того, как ваша база данных хорошо смоделирована. Я думаю, что хорошая идея работает в обоих направлениях и сравнивает результаты. – nanndoj

+0

Я разрабатываю проект, я до сих пор не могу сравнивать результаты. У меня есть одна таблица для каждого типа данных, и все они имеют столбец user_id, чтобы связать их. Я использую уникальный индекс для столбцов, но ничего больше. Нужен ли индекс для JOINS? Спасибо –

0

согласны ли Вы, что SQL строка типичной является что-то вроде:

SQL Row Example: 
    COLUMN1 COLUMN2 COLUMN3 COLUMN4 
    1   anyvalue 2   othervalue 

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

SQL Row Example: 
    COLUMN1 COLUMN2  COLUMN3 COLUMN4 
    SUBQUERY anyvalue  2   othervalue 

Lets go. Ошибка кулака:

1241 - Operand should contain 1 column(s)

Вы пытаетесь разместить 2 столбца в месте, которое должно иметь одно простое значение.

Вторая ошибка:

1242 - Subquery returns more than 1 row

ваш SQL возвращает количество строк со многими значениями, но она ожидает только одно простое значение, как я уже говорил ранее.

Добавление TOP, чтобы ограничить число строк было бы решением в вашем случае:

SELECT id, 
(SELECT TOP 1 payer_id FROM transactions WHERE id = user_id), 
(SELECT TOP 1 sentence FROM cofg_sentences WHERE id = user_id), 
(SELECT TOP 1 name FROM cofg_options WHERE id = user_id), 
(SELECT TOP 1 hour FROM cofg_time WHERE id = user_id), 
(SELECT TOP 1 url FROM cofg_feeds WHERE id = user_id), 
(SELECT TOP 1 fb_user FROM cofg_accounts WHERE id = user_id) 
FROM users WHERE token = '.......' 

Я не хочу вмешиваться в вашу логику. Я просто объясню что-то о подзапросе:

У вас есть 6 подзапросов в вашем SELECT. Это означает, что вы попадете в базу данных шесть раз для каждого пользователя. Если у вас 100 пользователей, вы будете поражать свою базу данных 600 раз только в одной простой инструкции SQL.

Подумайте об использовании соединений!

+0

Большое спасибо за ваше объяснение. Как вы думаете, я могу эффективно возвратить несколько столбцов с несколькими рядами из нескольких таблиц, используя INNER JOIN? –

Смежные вопросы