За последние 24 часа нас посетил 22651 программист и 1256 роботов. Сейчас ищет 741 программист ...

Выборка из базы даже если NULL

Тема в разделе "MySQL", создана пользователем ctekjlo, 21 авг 2009.

  1. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    Всем доброй ночи.

    Есть 2 таблицы

    материалы
    | id | name |

    приход расход материалов
    | id | id_материала | цена расхода или прихода | приход или уход | количество материалов |

    вот запрос который я подготовил но он выводит только те материалы которые есть в таблице "приход расход" а хотелось бы чтобы он материал цеплял даже если в таблице "приход расход" его нет

    [sql]SELECT
    material.id,
    SUM(prihod.kolvo * prihod.price)
    FROM
    material,
    prihod
    WHERE
    material.id = prihod.idmat
    AND prihod.tip = '1'
    GROUP BY
    material.id
    ORDER BY
    material.id;[/sql]
     
  2. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Читайте про OUTER LEFT JOIN. Пример:
    [sql]SELECT * FROM `Material` LEFT JOIN `Prihod` ON `Prihod`.`MaterialID` = `Material`.`ID`[/sql]
     
  3. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    а без JOIN тут вообще не обойтись?

    а то JOIN слищком много ячеек затрагивает?
     
  4. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    юзай индексы.
     
  5. kostyl

    kostyl Guest

    ctekjlo
    джоин затронет записи которые тебе надо, не парься..
     
  6. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    Может есть какой то параметр который будет ставить Null как и JOIN?
     
  7. kostyl

    kostyl Guest

    ctekjlo
    так будет дольше чем джоин
     
  8. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
  9. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    как задолбали криворукие загадочники, которые думают что все делают только так как они.
     
  10. kostyl

    kostyl Guest

    armadillo
    и не говори...
     
  11. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    я просто то JOIN уйти пытаюсь а мне всегда его и советуют с JOIN я и сам написать могу

    кстате в первом моем посте это лишнее вроде

    PHP:
    1. ORDER BY
    2. material.id
     
  12. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    >>>юзай индексы.

    без индексов он секунд на 50 падает
     
  13. kostyl

    kostyl Guest

    а почему ты пытаешься уйти от того, что придумано специально для твоей задачи?
     
  14. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    Думал есть другие варианты

    Люблю писать один раз и надолго
     
  15. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    Сейчас просто код улучшаю где чувак умудрялся извлекать 5 таблиц через SELECT * имя_таблицы а потом с кучей if и for все это разбирал. Лаги в программе просто ох**ть
     
  16. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    приведи этот запрос - любопытно, ибо сейчас как раз приходится использовать ифы )

    но самомнение конечно не обосновано ничем.
     
  17. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    if и for это из PHP он так данные разбирал и еще в циклы пару SELECT вставлял
     
  18. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    Вот тебе пример с IF

    PHP:
    1. $sql="SELECT * FROM sklad  ORDER BY naimenovanie";
    2. $success=mysql_query($sql);
    3. if(mysql_num_rows($success)>0) {
    4. $i = 0;
    5.     for($i=0;$i<=mysql_num_rows($success)-1;$i++) {
    6.         $i++;
    7.         $ryad=mysql_fetch_array($success);
    8.         $sql = "select * from nakl where idmat='".$ryad["id"]."' and tip='rashod'";
    9.         $res1 = mysql_query($sql);
    10.         $allstr = 0;
    11.         while($row1=mysql_fetch_array($res1)) {
    12.             $allstr -= $row1["kolvo"]*$row1["price"];
    13.         }
    14. }
    15. }
    Прикинул что будет если материалов не 100 щтук а 100000?
     
  19. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    да, это неинтересно.
     
  20. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    я пятый день ржу
    поле tip varchar(20) cp1251_general_ci
    [sql]$sql = "select * from nakl where idmat='".$ryad["id"]."' and tip='rashod'";[/sql]
    Возможные значения
    [sql]tip='rashod'";[/sql] и [sql]tip='prihod'";[/sql]
     
  21. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    ctekjlo, не слушай людей, которые говорят, что Джоины — зло. Они не понимают о чём говорят. Это охуенная и хорошо оптимизированная штука в базах данных, которую нужно обязательно использовать там, где надо получить записи из двух таблиц.
    http://www.php.ru/forum/viewtopic.php?t=20647&start=30

    Но индексы, естественно, должны стоять.
     
  22. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    не знаю но я теперь стараюсь делать JOIN там где без него не как не обойтись

    инфу по ссылке почитал полезно
     
  23. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    ctekjlo, лучше сделать один запрос с двумя Джоинами, чем три запроса без джоинов. Так и выполнится быстрее и ты облегчишь логику программы, так как уберешь ненужные действия.
     
  24. ctekjlo

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

    С нами с:
    20 июн 2009
    Сообщения:
    57
    Симпатии:
    0
    это да но я имел ввиду те запросы которые могут быть как с JOIN так и без него.

    [sql]SELECT
    user.id,
    roles.role
    message.msg
    FROM
    user,
    roles,
    message
    WHERE
    user.id = roles.id_user
    AND user.id_msg = message.id[/sql]

    Ну нет ведь смысла делать тут JOIN
     
  25. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    даааа.
    не надоело позориться?
    как называется эта операция?