За последние 24 часа нас посетили 9297 программистов и 668 роботов. Сейчас ищут 165 программистов ...

Выборка по несуществующей записи

Тема в разделе "MySQL", создана пользователем Nerfed, 29 ноя 2018.

  1. Nerfed

    Nerfed Новичок

    С нами с:
    21 июл 2017
    Сообщения:
    134
    Симпатии:
    5
    Пасаны, а как-то можно сделать такое? Есть 2 таблицы:

    1. loans
    [​IMG]
    2. utm
    [​IMG]

    Короче таблицы связаны через id в первой и loan_id во второй. В первой таблице запись есть всегда, во второй её может не быть, а может быть несколько с разными utm_source. Нужно вытащить все записи из первой, когда во второй таблице к ним нет записи с utm_source='admitad'. Это возможно сделать одним SQL-запросом?
    --- Добавлено ---
    Я думал что можно как-то так, но не прокатывает. Ругается: Unknown column 'lid' in 'where clause'
    PHP:
    1. "SELECT `id` AS `lid` FROM `loans`
    2. WHERE (SELECT `id` FROM `utm` WHERE `loan_id`= `lid` AND `utm_source`='admitad') IS NULL"
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.542
    Симпатии:
    137
    PHP:
    1. SELECT id AS lid
    2. FROM `loans`
    3. WHERE id NOT IN (
    4.     SELECT loan_id FROM `utm` WHERE utm_source='admitad'
    5. );
     
  3. Nerfed

    Nerfed Новичок

    С нами с:
    21 июл 2017
    Сообщения:
    134
    Симпатии:
    5
    Я правильно понимаю, что такой запрос будет сильно грузить сервер, если в таблице utm много записей? Оно же внутрь NOT IN вытащит вообще все айдишники. У меня получилось сделать так, но не знаю на сколько это правильно. На тестах вроде работает, но в продакшен ещё не выкладывал.
    PHP:
    1. SELECT `id` FROM `loans` AS `l`
    2. WHERE (SELECT `id` FROM `utm` WHERE `loan_id`= l.`id` AND `utm_source`='admitad') IS NULL
     
    #3 Nerfed, 1 дек 2018
    Последнее редактирование: 1 дек 2018
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.542
    Симпатии:
    137
    1) много записей это для вас сколько? сотни, тысячи, миллионы...?
    2) ну так задача стоит проверить среди всех айдишников. значит придется проверить среди всех. телепатия могла бы помочь, но это фича пока это в стадии бета тестирования
    3) думаю, при наличии индексов, будет работать быстро.