За последние 24 часа нас посетили 20829 программистов и 1132 робота. Сейчас ищут 359 программистов ...

Вложить запрос в другой с подстановкой данных

Тема в разделе "PHP и базы данных", создана пользователем AlexandrT, 2 окт 2018.

  1. AlexandrT

    AlexandrT Новичок

    С нами с:
    2 окт 2018
    Сообщения:
    2
    Симпатии:
    0
    Приветствую.
    Столкнулся с задачей и пока даже и не знаю в какую сторону копать.
    Может кто-то уже сталкивался с подобной задачей?

    и так, есть одна таблица:
    ID, lastName, name, midlName, refID (ну и ещё всякое, что сейчас не важно)
    где ID, это auto_increment,
    Ф,И,О - столбцы VARCHAR(24)
    и refID, это уникальный ID кого-то из этой же таблицы.

    SELECT*FROM`users` выглядит примерно так:
    1 | Превед | Первый | Нах | 1
    2 | Сидоров | Иван | Петрович | 1
    4 | Иванов | Пётр | Сидорович | 2
    15 | Пупкин | Василий | Батькович | 4

    а очень хочется вывести в браузер вместе с refID и соответствующее ему ФИО

    есть ли способ не загонять запросы в цикл?
     
  2. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Три раза перечитал, не понял что тебе нужно. Надо как то переформулировать наверно что ты хочешь. И если у тебя все хранится в одной таблице, это уже через задницу =)

    Одну строку с данными покажи хоть из таблицы.
     
  3. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Можно так:
    Код (Text):
    1. SELECT u1.*, u2.lastName as refLastName, u2.name as refName, u2.midlName as refMidlName
    2. FROM users as u1
    3. JOIN users as u2 ON(u2.id = u1.refID)
    4. HAVING u1.id = 4
     
  4. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Maputo, а зачем HAVING u1.id = 4 ? И почему JOIN без LEFT ? :)
     
  5. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Без HAVING не сработает а JOIN или JOIN LEFT в данном случае роли не играет. Связь - 1:1
    В конце концов вариантов куча - можете озвучить свой.
     
  6. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    сработает
    попробуйте у Пупкина взамест рефера указать NULL или несуществующий рефер
     
  7. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Попробуйте не флудить и не предлагать ерунды. Если Вы хотите в ключевом атрибуте хранить NULL - это Ваше право. ТС не просит переделывать его таблицу и БД.
    Я так и не увидел Ваш вариант.
     
  8. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Maputo, не нравится NULL, ваше право, но остаётся несуществующий рефер, ситуация вполне себе стандартная, но вы почему-то акцентировали внимание именно на NULL, который я предложил лишь для примера, как все возможные варианты, что бы продемонстрировать как изменится результат выборки.
    Свой вариант я предложил в своём первом посте, взять ваш вариант, убрать HAVING и добавить LEFT.
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.787
    Симпатии:
    646
    @Maputo, прежде чем что-то предлагать, надо бы понять, что реально нужно ТСу.

    ЧЁ? o_O
     
  10. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, тут всё предельно ясно написано.
     
    miketomlin и Maputo нравится это.
  11. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Нет. У ТСа четко выделена первая запись, как корневая. Наверняка ее id идет как значение по-умолчанию. Гадать бессмысленно. Но нуль лечится.
    Оформите, пожалуйста, в SQL-формате. Тут есть подводные камни. Хочется видеть все целиком.
     
  12. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Maputo, странный вы человек, словосочетание "гадать бессмысленно" сразу после слова "наверняка" :)
    Никаких подводных камней тут нет, доберусь до компьютера напишу вам запрос. Со смартфона ужасно не удобно это делать.
     
    Maputo нравится это.
  13. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Код (Text):
    1. SELECT u1.*, u2.lastName as refLastName, u2.name as refName, u2.midlName as refMidlName
    2. FROM users as u1
    3. LEFT JOIN users as u2 ON(u2.id = u1.refID)
     
  14. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Так я и думал. Вы всех пользователей собрались выводить) Там, как-минимум, "Первый" "Нах" не нужен.
     
  15. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Maputo, вы продолжаете гадать, что нужно, а что нет. ТС попросил без цикла вывести рядом с refID соответствующие этому идентификатору записи. И точка :)
     
    Maputo нравится это.
  16. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Принято)
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.787
    Симпатии:
    646
    @Maputo, действительно про эту петлю ничего не сказано. Ну можно добавить условие ID!=refID, только на каком основании?
    --- Добавлено ---
    И вот это тоже весьма сомнительное утверждение, сорри.
     
  18. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Пусть ТС решает, что ему нужно.
    Спорить не стану.
     
  19. AlexandrT

    AlexandrT Новичок

    С нами с:
    2 окт 2018
    Сообщения:
    2
    Симпатии:
    0
    Приветствую. Большое спасибо за ваши отзывы.
    Пока прочитал наискосок и считаю, что действительно нужно дать пояснения, чтобы избежать разночтений.

    ID пользователя, это уникальное значение, подставляемое самой БД.
    пользователи из таблицы исчезать не будут, т.е. никакие строки не удаляются,
    вместо этого я добавил `active` BOOL DEFAULT `1` и при необходимости просто "отключаю" строки,
    как раз для того, чтобы ни один refID не ссылался на несуществующую строку,
    впрочем для refID я на всякий случай указал DEFAULT `1`
    и теперь даже, если запись заводилась через гондурас, никаких NULL в таблице образоваться не может

    и да, задача в том, чтобы прочитать всю таблицу в массив и, разобрав в цикле, построчно показать записи,
    с ссылкой типа echo '<a href="'.$_SERVER['PHP_SELF'].'?refid='.$refid.'">'.$refname.'</a>';