Вопрос

Я использую MySQL.Вот моя схема:

Поставщики (сид:целое число, снэйм:строка, адресная строка)

Детали(пид:целое число, pname ( имя пользователя ):строка, цветная:строка)

Каталог(сид:целое число, pid:целое число, стоимость:настоящий)

(первичные ключи выделены жирным шрифтом)

Я пытаюсь написать запрос, который выбирает пары sidкоторые поставляют одну и ту же деталь:

-- Find pairs of SIDs that both supply the same part
SELECT s1.sid, s2.sid
FROM Suppliers AS s1, Suppliers AS s2
JOIN Catalog ON s1.sid = Catalog.sid OR s2.sid = Catalog.sid;

MySQL выдает мне эту ошибку:

ОШИБКА 1054 (42S22):Неизвестный столбец "s1.sid" в предложении "on"

Что я делаю не так?

Это было полезно?

Решение

поиск запчастей у двух или более поставщиков:

select part_id
from catalog 
group by part_id
having count(part_id) >= 2

найти поставщика (ов) этих запчастей, более перспективных, можно у двух или более поставщиков:

select c.part_id, s.supplier_name 
from catalog c
join supplier s
where c.part_id in (
    select part_id
    from catalog 
    group by part_id
    having count(part_id) >= 2)
order by c.part_id, s.supplier_name

но если вам нужны запчасти, у которых точно есть только два поставщика:

select c.part_id, group_concat(s.supplier_name) as suppliers 
from catalog c
join supplier s using(supplier_id)
where part_id in (
    select part_id
    from catalog 
    group by part_id
    having count(part_id) = 2)
group by c.part_id

если вы хотите, чтобы в двух столбцах отображались только эти два поставщика..я тоже думаю...:-)

[ОБНОВЛЕНИЕ]

то, что я придумал:

select c.part_id, c.min(c.supplier_id) as first, c.max(c.supplier_id) as second 
from catalog c
join supplier s
where c.part_id in (
    select part_id
    from catalog 
    group by part_id
    having count(part_id) = 2)
group by c.part_id
order by c.part_id

чтобы получить имена поставщиков:

select x.part_id, a.supplier_name, b.supplier_name from
(
    select c.part_id, c.min(c.supplier_id) as first, c.max(c.supplier_id) as second 
    from catalog c
    join supplier s
    where c.part_id in (
        select part_id
        from catalog 
        group by part_id
        having count(part_id) = 2)
    group by c.part_id
    order by c.part_id
 ) as x
 join supplier a on x.first = a.sid
 join supplier b on x.second = b.sid

Другие советы

Вы присоединяетесь к s2 и Каталогу.s1 не существует в этом предложении.

Вы смешиваете синтаксис соединения ANSI-89 и ANSI-92 - вы можете использовать только один или другой.ANSI-92:

   SELECT s1.sid, s2.sid
     FROM CATALOG c
LEFT JOIN SUPPLIERS s1 ON s1.sid = c.sid
LEFT JOIN SUPPLIERS s2 ON s2.sid = c.sid

Опустите LEFT ключевое слово, если вы хотите видеть категории, связанные с двумя поставщиками.

Синтаксис ANSI-89 содержит все задействованные таблицы, объявленные в предложении FROM, соединения находятся в предложении WHERE.

Используйте ANSI-92 - смотрите Этот вопрос для получения подробной информации.

Я не понимаю сообщения об ошибке, но:

Я бы не стал использовать join в этом случае.Попробуй это

SELECT s1.sid, s2.sid
FROM suppliers s1,
     suppliers s2,
     catalog   c1,
     catalog   c2
WHERE c1.pid = c2.pid
AND   s1.sid = c1.sid
AND   s2.sid = c2.sid
AND   s1.sid < s2.sid

Хотя, поскольку все, о чем вы просите, - это sids, это может быть проще:

SELECT c1.sid, c2.sid
FROM catalog   c1,
     catalog   c2
WHERE c1.pid = c2.pid
AND   c1.sid < c2.sid

Я думаю, вам нужно явно объединить все таблицы, если вы будете использовать явные соединения.

например ,

-- Find pairs of SIDs that both supply the same part
SELECT 
  s1.sid, 
  s2.sid
FROM 
  Catalog 

    LEFT OUTER JOIN 
  Suppliers AS s1,
    ON Catalog.sid = s1.sid

    LEFT OUTER JOIN
  Suppliers AS s2
    ON Catalog.sid = s2.sid 

Вам нужно объединить каталог с самим собой

SELECT 
    pid, 
    c1.sid, 
    c2.sid
FROM Catalog c1
JOIN Catalog c2 ON c1.pid = c2.pid AND c1.sid < c2.sid

< условие состоит в том, чтобы избегать пар (A поставляет тот же X, что и B, поэтому B поставляет тот же X, что и A).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top