За последние 24 часа нас посетили 6275 программистов и 481 робот. Сейчас ищут 138 программистов ...

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

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

  1. Nerfed

    Nerfed Новичок

    С нами с:
    21 июл 2017
    Сообщения:
    127
    Симпатии:
    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.502
    Симпатии:
    124
    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
    Сообщения:
    127
    Симпатии:
    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.502
    Симпатии:
    124
    1) много записей это для вас сколько? сотни, тысячи, миллионы...?
    2) ну так задача стоит проверить среди всех айдишников. значит придется проверить среди всех. телепатия могла бы помочь, но это фича пока это в стадии бета тестирования
    3) думаю, при наличии индексов, будет работать быстро.