За последние 24 часа нас посетили 16664 программиста и 1677 роботов. Сейчас ищут 936 программистов ...

После присоединения таблицы, нужно ненужное отсеять JOIN

Тема в разделе "PHP и базы данных", создана пользователем ky3mu4u, 8 авг 2011.

  1. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    Есть такой запрос:
    $sql = "SELECT DISTINCT u.id, u.name, u.username, u.block, DATE_FORMAT(u.registerDate, '%d.%m.%Y') as registerDate, scu.status, scu.status2, scu.expects, scu.dog_send, scu.upload, scu.params, scu.newor, r.statu"
    . "\n FROM #__users as u"
    . "\n INNER JOIN #__scusers as scu ON(scu.user_id = u.id)"
    . "\n LEFT JOIN #__screport as r ON(r.user_id = scu.user_id)"
    . $where
    . $orderby
    ;

    вот эту таблицу я присоединил:
    . "\n LEFT JOIN #__screport as r ON(r.user_id = scu.user_id)"
    присоединял таблицу только из за параметра r.statu
    у него 2 вареанта либо 0 либо 1.
    Он у меня вывел и с параметром 0 и с параметром 1, бывает что некоторые запросы двояться из за того что в таблице screport которую я присоеденил по ID пробегают по 2-5 одинаковых ID с разными параметрами r.statu
    сейчас выводит к примеру ID 222 с параметром 0 потом ID 222 с параметром 1.
    а мне тупа на начальном уровне запроса надо отсеить все r.statu которые равны 0, мне только нужны с параметром 1.
    Через . $where не получаеться он вообще только их выводит, а все остальное уберает.
    Нужна помощь, какие есть предложения куда вставить r.statu != 0 ??? какнибуть в SELECT DISTINCT его запехнуть)))
     
  2. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    если сделать вот так:
    $sql = "SELECT DISTINCT u.id, u.name, u.username, u.block, DATE_FORMAT(u.registerDate, '%d.%m.%Y') as registerDate, scu.status, scu.status2, scu.expects, scu.dog_send, scu.upload, scu.params, scu.newor, r.statu"
    . "\n FROM #__users as u"
    . "\n INNER JOIN #__scusers as scu ON(scu.user_id = u.id)"
    . "\n LEFT JOIN #__screport as r ON(r.user_id = scu.user_id)"
    . "\n OR r.statu = 0"
    . $where
    . $orderby
    ;
    тоесть прописать . "\n OR r.statu = 0" то все нормально, но в таблице присутствуют дубликаты ID
     
  3. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    вот так все нормально выводит
    jimport('joomla.html.pagination');
    $pagination = new JPagination( $total, $limitstart, $limit );

    $sql = "SELECT DISTINCT u.id, u.name, u.username, u.block, DATE_FORMAT(u.registerDate, '%d.%m.%Y') as registerDate, scu.status, scu.status2, scu.user_id, scu.expects, scu.dog_send, scu.upload, scu.params, scu.newor, r.statu"
    . "\n FROM #__users as u"
    . "\n INNER JOIN #__scusers as scu ON(scu.user_id = u.id)"
    . "\n LEFT JOIN #__screport as r ON(r.user_id = u.id)"
    . $where
    . "\n GROUP BY u.id DESC"
    . $orderby
    даже выводит некоторых пользователей из таблицы screport с параметром r.statu = 1 (только тех у кого нет повторяющегося ID по которому идет соединения таблицы)
    как сделать так чтобы скрипт считывал даже повторные ID в таблице screport проверял у какого ID есть параметр r.statu = 1 и выводил параметр r.statu = 1 в соедененой таблице!
     
  4. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    вот еслибы на начальном уровне можно было прописать $sql = "SELECT DISTINCT u.id, u.name, u.username, u.block, DATE_FORMAT(u.registerDate, '%d.%m.%Y') as registerDate, scu.status, scu.status2, scu.user_id, scu.expects, scu.dog_send, scu.upload, scu.params, scu.newor, r.statu = 1"
    где r.status = 1 былобы все отлично, он бы прочел только те строки где есть параметр r.status = 1 а потом соеденил бы их и выводилось бы все правильно!
    Реально так сделать?
     
  5. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    Также с помощью where r.statu = 1; получаеться вывести этих пользователей, но остальные пользователи не выводяться из соединеных таблиц! просто я какбы хочу сделать ORDER BY r.statu = 1.
     
  6. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    Спасибо что не кто не проявил интерес((( сам разобрался, в итоге надо было сделать вот так:
    . "\n LEFT JOIN #__screport as r ON(r.statu = 1 and r.user_id = u.id)"
    сначала он считывает все r.statu = 1 а потом их соединяет)))