За последние 24 часа нас посетили 22518 программистов и 1153 робота. Сейчас ищут 637 программистов ...

помогите с запросом

Тема в разделе "MySQL", создана пользователем SibBear, 25 апр 2020.

  1. SibBear

    SibBear Новичок

    С нами с:
    4 апр 2020
    Сообщения:
    127
    Симпатии:
    7
    чето я подтупливаю с запросом

    есть 4 таблицы
    t1 продукт - p_id, name
    t2 ссылка на продукт - p_id, url
    t3 информация о продукте - id, p_id, inf_typ, inf_val
    t4 справочник вариантов информации - inf_typ, inf_name

    Код (Text):
    1. SELECT * FROM t1
    2. JOIN t4
    3. LEFT JOIN t3 USING (p_id)
    4. LEFT JOIN t2 USING (p_id)
    5. WHERE t1.p_id = 101 GROUP BY (t4.inf_typ)
    смысл забрать все данные из этих таблиц одним запросом. Проблема вот в чем. Если в t3 о данном продукте нет ничего, то выдается N строк с NULL в полях t3.id, t3.inf_typ, t3.inf_val что норм, по следующему полю я получил N строк какие вообще варианты есть (inf_name).
    Но если данные в t3 есть, то не важно сколько их вариантов, всегда выдается значение первого.
    если поменять GROUP BY (t3.inf_typ), то наоборот, если данные есть то все красиво выводится - inf_name -> inf_val. Но если данных в t3 нет то идет одна строка, потому что получается GROUP BY NULL

    (Допустим N=3, варианты инфо это описание, большое описание, и малюсенькое описание...)
     
  2. SibBear

    SibBear Новичок

    С нами с:
    4 апр 2020
    Сообщения:
    127
    Симпатии:
    7
    в конкретном приложении это не принципиально, количество данных не большое, можно и три запроса сделать отдельно, на каждую таблицу по p_id, но просто было интересно.
    в общем решил комбинацией ON (OR AND OR) отказавшись от прямых USING()
     
  3. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @SibBear , начнём с того, что звёздам в реальных запросах не место. Тем более с джоинами. И тем еще более с группировкой.
    Необходимо точно указать какое поле из какой таблицы необходимо получить в результате. А при группировке чаще всего еще и конкатенация потребуется ( GROUP_CONCAT() )
     
    SibBear нравится это.
  4. SibBear

    SibBear Новичок

    С нами с:
    4 апр 2020
    Сообщения:
    127
    Симпатии:
    7
    звезда уйдет когда таблицы будут закончены, сейчас еще правки, что то меняется что то добавляется....
     
  5. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    За отмаз не катит :)
    --- Добавлено ---
    @SibBear, сейчас MySQL умеет работать с JSON типом полей. Почитайте как это используют для хранения характеристик товаров.
    Хотя на самом деле интернет магазин это большой и сложный организм, а не только хранение и вывод товаров по категориям.
    Так что дальше баловства для общего развития у Вас ничего не получится :)
     
    SibBear нравится это.
  6. SibBear

    SibBear Новичок

    С нами с:
    4 апр 2020
    Сообщения:
    127
    Симпатии:
    7
    ниче, 10 лет на моем магазине народ работает и у всех получается, появилась надобность себе сделать, а там 10 лет ниче не менялось:) вот и сидю развлекаюсь пока мне шаблон рисуют, с этим чето ваще бяда, старею, вдохновение не приходит на креатив ))))
     
  7. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Полагаю речь о скачанном 10 лет назад скрипте с какого-нибудь забугорного сайта, или всё-таки речь о написанном единолично собственными руками с нуля коде? Можно ссылочку в личку?

    P/S Очень часто слышу, когда человек берёт бесплатный скрипт устанавливает на него бесплатный шаблон и говорит - я сделал сайт :)
     
    SibBear нравится это.
  8. SibBear

    SibBear Новичок

    С нами с:
    4 апр 2020
    Сообщения:
    127
    Симпатии:
    7
    Так все с того начинают )))
     
  9. SibBear

    SibBear Новичок

    С нами с:
    4 апр 2020
    Сообщения:
    127
    Симпатии:
    7
    По поводу * знаешь, что мне не нравится в прямом указании, когда тебе приходит seoшник и говорит мне надо еще вот такое и вот такое поле, приходится лезть в код и дописывать запросы, а так у администратора есть справочник, куда он просто добавляет "novoe_seo_pole", и в шаблон добавляет в нужном месте <?php echo $seo_field['novoe_seo_pole']; ?>
    при небольшом объеме данных изменения в скорости не значительны. Хотя законченный проект перед запуском да, поля пропишу явно. Сейчас пока некоторые поля перемещаются с таблицы в таблицу ))
     
  10. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @SibBear, сделайте демонстрационный пример с набором исходных данных на db-fiddle.
    Для начала хоть будет понятно, сколько в t3 может быть записей для пары (p_id, inf_typ) :)