Помогите мне построить этот MySQL Query - PullRequest
0 голосов
/ 28 августа 2009

это должно быть легко, но это не так: (

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

Мне нужно найти способ сказать:

«показать мне все зоомагазины, в которых есть щенки, котята, мыши или рыба» (хотя бы один)

Это легкая часть.

То, что я застрял в это ...

"покажи мне все зоомагазины, в которых наверняка есть щенки, но, возможно, котята, мыши или рыбы"

Есть идеи? :)

Спасибо, ребята!

Edit:

Я разместил этот вопрос на другом сайте, но ответа не получил, выложу здесь. Это мой оригинальный вопрос, пожалуйста, рассмотрите также:

+ ------------------ + ---------- + --------- +

¦ Столбец1 ¦ Столбец2 ¦ Актив ¦

+ ------------------ + ---------- + --------- +

¦ синие виджеты ¦ 14 ¦ у ¦

¦ красный ¦ 14 ¦ у ¦

¦ redx ¦ 15 ¦ y ¦

¦ блюз ¦ 14 ¦ ¦

синий ¦ 15 ¦ n ¦

lu блюзX ¦ 15 ¦ n ¦

¦ виджеты ¦ 14 ¦ n ¦

+ ------------------ + ---------- + --------- +

Вот моя драма ... Мне нужно запросить это:

где (Столбец2 = 14 И Столбец2 = 15) и активный = 'у'

Я набор результатов, в котором есть все записи, где есть active = 'y' для Column2 = 14 и Column2 = 15

Я не могу понять это ...

Я могу сделать это, чтобы он возвращал мне 14 и 15, по крайней мере, один из них как у, но не оба.

Я пытался:

выберите * из таблицы, где (Столбец2 = 14 и Столбец2 = 15) и активный = 'у'

Конечно, это ничего не возвращает, так как оба не могут быть 14 и 15 одновременно.

Итак, я попробовал:

выберите * из таблицы, где ((Столбец2 = 14 или Столбец2 = 15) и активный = 'y')

И это возвращает набор результатов, но не то, что я хочу ...

Мне нужно только возвращать результаты в столбце 1, которые имеют:

column2 = 14 и active = 'y' column2 = 15 и active = 'y'

оба условия должны быть выполнены.

Любая помощь? Спасибо, парни!

Ответы [ 6 ]

2 голосов
/ 28 августа 2009

Я также не хочу давать ответ, но я дам вам несколько советов.

Предположим, что интересующие вас строки выглядят так:

col1 col2 active
 red  14   y
 red  15   y

Затем вы хотите, чтобы цвет был таким, чтобы у какой-то строки было 14 & y, а у какой-то другой строки - 15 & y.
И, конечно же, цвет в обоих рядах должен быть одинаковым.

Ответ связан с этим принципом:

Любое выражение SQL ссылается только на одну строку за раз.

Вы можете использовать JOIN для объединения одной строки с другой строкой, и в результате получается одна новая строка, которая имеет вдвое больше столбцов и существует эфемерно по мере выполнения запроса (то есть он нигде не сохраняется). Поскольку теперь это одна строка, вы можете использовать выражения SQL для записи для сравнения столбцов, которые существуют в отдельных строках исходной таблицы.

Другая концепция, которая важна для использования объединений: псевдонимы таблиц .

Достаточно ли этого для продолжения?


Хорошо, да, я не хотел, потому что вопрос был помечен как домашнее задание. Но это больше не так.

Вот что я имею в виду:

SELECT DISTINCT col1
FROM mytable t1 JOIN mytable t2
 ON (t1.col1 = t2.col1)              -- i.e. they are both red
WHERE t1.col2 = 14 AND t1.active = 'y'
 AND  t2.col2 = 15 AND t2.active = 'y';

Как только вы выполните объединение, столбцы из обеих таблиц появятся в одной строке (по крайней мере, в формируемом наборе результатов, а не в хранилище). Таким образом, вы можете написать выражение, ссылающееся на столбцы из обеих строк базовой таблицы.

1 голос
/ 28 августа 2009

Ссылаясь на свою таблицу, вы, вероятно, ищете что-то вроде:

SELECT DISTINCT t1.col1 FROM table t1 INNER JOIN table t2 ON t1.col1 = t2.col1 AND t1.col2 = 'puppies' AND t2.col2 IN ('mice','fish','reptiles')

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

1 голос
/ 28 августа 2009

Извините, ваш вопрос все еще плохо определен: вы говорите, что хотите выбрать строки, у которых есть и column2 = 14, и column2 = 15. Простой: не существует, второй столбец имеет не более одного значения (и может быть нулевым)

Поскольку вопрос помечен как домашнее задание, я не собираюсь просто давать вам ответ. Прежде всего, задайте себе вопрос уникальности: возможно ли, что есть несколько строк с column1 = 'red' и column2 = '14'? Если нет, то вам просто нужно посчитать, сколько требований "column2 = 'some value'" выполнено, и выбрать только те, в которых это число является полным числом требований.

Если это так, попробуйте

SELECT
  Column1,
  SUM(Column2 IN (14, 15)) AS NumberOfRequirementsMet
FROM table
WHERE Active = 'y'
GROUP BY Column1
HAVING NumberOfRequirementsMet = 2;
1 голос
/ 28 августа 2009

Предполагая, что ваша таблица определена как

id, pet_store_name, pet_type


select distinct   
     pet_store_name
from 
     pet_store
where    
     pet_type = 'puppies' AND
     pet_store_name in (select pet_store_name from pet_store 
                        where pet_type in('kittens', 'mice', 'fish')
1 голос
/ 28 августа 2009

Вы можете сделать что-то вроде этого:

select
    pet_store_name
from pet_store
where
    pet_type = 'puppies' or
    (pet_type in ('kittens', 'mice', 'fish'))

* Редактировать : См. Ответ Майкла.

1 голос
/ 28 августа 2009

Это просто:

SELECT * FROM table 
WHERE (Column2 = 14 AND active = 'y') OR (Column2 = 15 AND active = 'y')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...