2016-12-07 5 views
1

Мне нужен ваш совет, чтобы наилучшим образом пройти и вернуть значения из базы данных (как показано ниже). Структура базы данных задается другим приложением.Производительность и оптимизация операторов MySQL

Как в настоящее время система возвращает значение пользователя с ID = 6 в этом случае:

Посмотрите на экземпляр элемента и модуль элемента (1 и обучение) и возвращает идентификатор строки. Используя этот идентификатор строки, искать соответствующий Itemid и идентификатор пользователя в таблице 2.

grade_grades

Table1

grade_items

Table2

Текущие SQL/функции:

функция 1 {SELECT ID FROM grade_items WHERE itemmodule = 'training' и iteminstan се = '1'} (возвращает идентификатор)

функция 2 {используя возвращенный идентификатор, выполнить следующую команду: SELECT * FROM grade_grades WHERE Itemid = '4' и USERID = '6'} (возвращает finalgrade)

Есть ли более простой способ получить все это в одном операторе MYSQL, а не запускать два запроса? (Причина, по которой я спрашиваю, заключается в том, что потенциал каждого из этих запросов будет выполняться от 100 до 10000 раз - в зависимости от количества пользователей в списке. В настоящее время - сервер останавливается примерно на 15 минут, если я запускаю запрос всех записей (без pagenation для расчета суммы)

+0

вы можете «присоединиться» к общей колонке. есть ли? – Rahul

+0

У вас есть соответствующие индексы в базе данных? – cichy

ответ

1

Просто присоединиться к ним вместе:

SELECT g.* 
FROM grade_items g 
JOIN grade_grades g2 
ON(g2.id = g.itemid) 
WHERE g2.itemmodule = 'training' and g2.iteminstance = '1' 

Или же используйте IN():

SELECT g.* 
FROM grade_items g 
WHERE g.itemid IN(SELECT g2.id FROM grade_grades g2 
        WHERE g2.itemmodule = 'training' 
        and g2.iteminstance = '1') 
0

Использование РЕГИСТРИРУЙТЕСЬ который с омбины из двух или более таблиц

SELECT * 
FROM grade_grades 
JOIN grade_items ON grade_grades.id = grade_items.itemid 
WHERE itemid = 4 
Смежные вопросы