|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
Всем привет, Есть две связанные таблицы, например упрощенно Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Нужно получить mat_tch_test_type из родительской таблицы materials, где есть в дочерней таблице тесты, например уровня 1. Сделал два варианта, вроде работают. Какой из них правильный и более предпочтительный. Вариант 1 Код: sql 1. 2. 3. 4.
Вариант 2 Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 11:01 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
оба варианта совершенно одинаковые (на 100%) предпочтительнее первый, где родительская "слева", "справа" привязываем подчиненную. Возможно для "левшей" удобнее второй вариант, у них полушария по другому работают. Я правша... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 13:47 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
savsoft, Порядок перечисления таблиц в JOIN-е значения не имеет. По крайней мере до тех пор, пока этих таблиц в запросе становится не слишком много и пока оптимизатор в силах перебрать все комбинации их соединения. В WHERE не надо повторять условия соединения из JOIN. В случае простого JOIN это бессмысленно, а в случае LEFT JOIN даже вредно. LIMIT 1 даст какую-то одну запись, без определенности какую именно и даже без гарантии повторяемости. У полей в запросе очень желательно явно указывать имена или алиасы таблиц, иначе для стороннего человека читабельность запроса резко падает. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:06 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
miksoft savsoft, LIMIT 1 даст какую-то одну запись, без определенности какую именно и даже без гарантии повторяемости. По условию, к одной родительской записи могут быть прицеплены дочерние только одного типа. Поэтому поставил LIMIT 1. miksoft savsoft, У полей в запросе очень желательно явно указывать имена или алиасы таблиц, иначе для стороннего человека читабельность запроса резко падает. Я использую уникальные префиксы полей, но для читабельности нужно использовать имена или алиасы. Поправлю. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:16 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
Всем спасибо за помощь, буду дальше изучать JOINs. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:17 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
savsoft По условию, к одной родительской записи могут быть прицеплены дочерние только одного типа. Поэтому поставил LIMIT 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:18 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
savsoft Я использую уникальные префиксы полей ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:19 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
savsoft , поскольку используется просто JOIN, который по факту INNER JOIN, порядок таблиц неважен. Но всё изменится, если нужно использовать внешнее связывание (LEFT JOIN) - тут порядок будет критичен. Впрочем, всегда старайтесь таблицы со стороны "один" располагать раньше по тексту, чем таблицы со стороны "много". savsoft По условию, к одной родительской записи могут быть прицеплены дочерние только одного типа. Поэтому поставил LIMIT 1. Что бы, какие зависимости, не были закопаны в конкретных данных, это не должно влиять на запрос. В данном случае схема не запрещает существования нескольких записей, соответствующих условиям отбора. А в этом случае ОБЯЗАТЕЛЬНО наличие ORDER BY, причём по уникальному выражению - в противном случае запрос получается недетерминированным, и два его выполнения на одних и тех же данных могут дать разные результаты , что в общем ни в какие ворота... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:24 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
Значит в итоге получается такой запрос в функции Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 15:10 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
savsoft, а функция-то зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 15:51 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
miksoft, Есть таблица учебных материалов, к которым есть материалы учителя и, возможно, материалы тестов. Заполняю таблицу материалов и функцией определяю, есть ли тесты. Если есть, то иконка тестов, иначе пустая иконка. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 16:54 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
savsoft, Подозреваю, что вам нужно использовать EXISTS вместо функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 18:57 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
miksoft savsoft, Подозреваю, что вам нужно использовать EXISTS вместо функции. Мне нужна инфа о существовании тестов в результате селекта, а не в условиях. Типа Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 20:14 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
savsoft Мне нужна инфа о существовании тестов в результате селекта, а не в условиях. miksoft нужно использовать EXISTS вместо функции ... в списке вывода. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 22:40 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
Akina savsoft Мне нужна инфа о существовании тестов в результате селекта, а не в условиях. miksoft нужно использовать EXISTS вместо функции ... в списке вывода. И как это написать? Я только нашел примеры EXISTS в условии WHERE. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 23:31 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
Код: sql 1.
Вернёт соответственно 0 или 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2020, 18:42 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
savsoft, начнем со слов "едрить-мадрить"))) такой функции обычно не требуется... ну да ладно... обычно такое требуется при построении интерфейса, допустим в вэб сразу вместе с данными получаем список, вместе с принадлежностью - есть тесты или нет, чтобы отрисовать "значок-ярлычок" Код: sql 1. 2. 3. 4. 5. 6.
LEFT JOIN - показывает все записи из родительской таблицы, условия в ON не отрубают записи c таблицы "слева" , если укажем условия в WHERE - то превратим LEFT JOIN в INNER JOIN, условие в WHERE будет применено и к родительской таблице "слева" . Вот такая разница между условием в ON и в WHERE т.е. чтобы получить все "разом" - можем сделать так Код: sql 1. 2. 3. 4. 5. 6.
и вместе с данными можем отрисовать ярлыки, а не дергать функцию на каждую строку... ... однако выходной.... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2020, 18:59 |
|
JOIN и WHERE
|
|||
---|---|---|---|
#18+
Akina Код: sql 1.
Вернёт соответственно 0 или 1. Спасибо, работает в разы быстрее, чем с функцией. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2020, 20:40 |
|
|
start [/forum/topic.php?fid=47&msg=39935500&tid=1828711]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
108ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 213ms |
0 / 0 |