Как из столбца таблицы составить пары без одинаковых значений?

Ссылка скопирована
1 ответ

Используя данные из таблицы городов, составьте одним запросом всевозможные пары городов так, чтобы в результате не было пар с одинаковыми названиями городов. Для решения необходимо использовать декартово произведение.

select c.city as "Город" , c1.city as "Город 2" from city c  cross join city c1 where c1.city_id > c.city_id

select c.city as "Город" , c1.city as "Город 2" from city c cross join city c1 where c1.city_id > c.city_id

Я думал,что ответ верный,но прислали на пересдачу.

Дополнительно:

А почему именно больше то? Может стоит использовать !=

  • Дмитрий, тогда вероятно будет пары Москва Питер, Питер Москва, что вроде считается повторением
  • Обычно строки сравнивают через "не равно" (!=)

    P.S. Ты ходил 4 раза?? И что? Фиксил по одной букве? Слушай как ты вообще сам себя проверяешь?
    Мог бы уже установить себе dbms и воспроизвести все до получения результата!

  • scottparker, ну это не повод использовать > - вылетят города которые не равны но айди меньше
  • scottparker, давайте смоделируем.
    1|New York 2|Moscow 3|London

    1|New York 2|Moscow 3|London

    Всего 6 пар.

  • А чего весь вопрос в заголовке не написал?
  • Были проблемы с другими заданиями,это задание мне прислали уже 3 раз и все никак. Я исправлял на != и все равно присылали на доработку, больше вариантов не осталось.@mayton2019,

    Как из столбца таблицы составить пары без одинаковых значений?

    Должно получиться.как на фото, у меня так и получалось. Совсем себя глупым ощутил и решил посоветоваться с вами.

  • Пасечник Кузьмич, это и есть весь вопрос, сам не знаю,что не так.
  • slavagorschenin, дб какая?
  • Дмитрий, использовал оба варианта и оба варианта прислали на пересдачу(
  • mayton2019, а должно быть три по идее. Нью-Йорк Лондон, Нью-Йорк Москва, Лондон Москва
  • vilinyh, я тоже думал,что нет ошибки,принимает преподаватель, алиасы я присвоил, перепробовал варианты с > и с != и сортировал по столбцам,все равно сижу на пересдаче)) Прилагаю ответ преподавателя,который мне не помог)

    Выполните запрос:
    select *
    from city c
    where c.city = 'London'
    Получите два города с одинаковым названием, но разными id (312 и 313).

    Сейчас Вы пишите условие, что where c1.city_id > c.city_id. Если изначально при Декартовом произведении Вы получите:
    312 - 313
    313 - 312
    то после условия останется 313 - 312, то есть Лондон - Лондон, а в задании указано, что не должно быть пар с одинаковыми значениями, а они у Вас есть:

    select c.city as "Город" , c1.city as "Город 2"
    from city c
    cross join city c1
    where c1.city_id > c.city_id and c.city = 'London' and c1.city = 'London'
    Таким образом условие по идентификаторам ложное.

  • сразу комент препода не судьба была написать?
    where c1.city_id > c.city_id and c.city != c1.city
  • slavagorschenin, я не понимаю что за преподаватель у тебя. Мог бы на 4 пересдаче уже скипнуть это задание и дать тебе другое. Может он хочет взятку? Занеси ему бутылку алкоголя. Но в этом обсуждении уже даже не смешно продолжать.
  • slavagorschenin, Чтоб как на фото - помемять > на < https://sqlize.online/sql/mysql57/0ae4fe04912e1122...
  • Возможно вместо > использовать IS DISTINCT FROM
    Но не уверен, что это где-то кроме postgres будет работать.
  • mayton2019, это Нетология, там нельзя скипнуть, там у всех одинаковый набор заданий))
  • Ответы:

    Ну совсем тупой вариант

    select * from (select    least(city.id, city2.id) as id1,    greatest(city.id, city2.id) as id2   from city    join city as city2 on city.id != city2.id    group by   least(city.id, city2.id), greatest(city.id, city2.id)  ) as t join city as city1 on city1.id = id1 join city as city2 on city2.id = id2;

    select * from (select least(city.id, city2.id) as id1, greatest(city.id, city2.id) as id2 from city join city as city2 on city.id != city2.id group by least(city.id, city2.id), greatest(city.id, city2.id) ) as t join city as city1 on city1.id = id1 join city as city2 on city2.id = id2;

    Если подумать то конечно можно проще

    select  LEAST(city.name, city1.name), GREATEST(city.name, city1.name) from city  inner join city as city1 on city1.id != city.id GROUP BY LEAST(city.name, city1.name), GREATEST(city.name, city1.name);

    select LEAST(city.name, city1.name), GREATEST(city.name, city1.name) from city inner join city as city1 on city1.id != city.id GROUP BY LEAST(city.name, city1.name), GREATEST(city.name, city1.name);

    • слишком сложно для моего уровня)
    • slavagorschenin, какую тему изучали?
    • slavagorschenin, и db то какое?
    • Второй запрос правильный, но поскольку названия городов не уникальны:
      inner join city as city1 on city1.name != city.name

      inner join city as city1 on city1.name != city.name

    С учётом неуникальности названия городов:

    select DISTINCT c.city as "Город 1" , c1.city as "Город 2"   from city c    cross join city c1   where c1.city &gt; c.city

    select DISTINCT c.city as "Город 1" , c1.city as "Город 2" from city c cross join city c1 where c1.city &gt; c.city

    я бы попробовал вариант с объединением четных и нечетных строк таблицы

    • умножение? я тоже думал об этом,но не знаю,где можно умножить,спасибо за помощь.
    • slavagorschenin, я не говорил про умножение,
      имел ввиду что бы сначала выбирать четные строки, и объединять с этой же таблицей но выбирать нечетные строки

      конечно надо не забыть про мелочи, типа одинаково отсортировать их и т.п.

    Задача из Нетологии.
    К сожалению, проверки ДЗ у меня нет, но я решил так:

    select c.city as "Город 1", c2.city as "Город 2" from (select distinct city from city) c cross join (select distinct city from city) c2 where c.city &lt;&gt; c2.city order by "Город 1", "Город 2"

    select c.city as "Город 1", c2.city as "Город 2" from (select distinct city from city) c cross join (select distinct city from city) c2 where c.city &lt;&gt; c2.city order by "Город 1", "Город 2"

    Доброго дня всем) у меня такой вариант:

    select c.city, c2.city  from city c, city c2  where c.city &lt;&gt; c2.city

    select c.city, c2.city from city c, city c2 where c.city &lt;&gt; c2.city

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Юрий Linux Ответ

    Для составления пар без одинаковых значений из столбца таблицы, можно воспользоваться SQL запросом, который будет выбирать уникальные значения из столбца и формировать пары на их основе.

    Пример SQL запроса для таблицы с названием "table_name" и столбцом "column_name":

    SELECT t1.column_name AS value1, t2.column_name AS value2
    FROM table_name t1
    JOIN table_name t2 ON t1.column_name  t2.column_name

    SELECT t1.column_name AS value1, t2.column_name AS value2 FROM table_name t1 JOIN table_name t2 ON t1.column_name t2.column_name

    В данном запросе используется оператор JOIN для объединения таблицы саму с собой, чтобы создать все возможные комбинации значений из столбца. Условие t1.column_name t2.column_name гарантирует, что значения в паре будут различными.

    После выполнения данного запроса, вы получите все возможные уникальные пары значений из столбца таблицы. При необходимости, можно также добавить дополнительные условия или фильтры для дальнейшей обработки данных.

    Надеюсь, данное объяснение поможет вам решить задачу по составлению пар без одинаковых значений из столбца таблицы. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно