Как выбрать одно значение из столбца на основе нескольких значений из другого столбца в SQL / php - PullRequest
0 голосов
/ 20 июля 2011

База данных не моя. Структура

fid| uid | value
 3 |  3  | spain
 3 |  5  | France
 2 |  3  | 45
 6 |  3  | male
 6 |  5  | female
 2 |  5  | 32

Идентификатор поля - это первичный ключ в другой таблице, о котором я хотел бы забыть. Я пытаюсь найти все UID, которые имеют значения "Испания", "мужской"

У меня есть следующие рабочие.

SELECT uid 
FROM DATABASE
WHERE value IN ('spain', 'male') GROUP BY uid HAVING COUNT(*) >= 2

Уловка заключается в следующем .. Как бы я выбрал самца, Испания со значением в диапазоне 20-30 (то есть мужчины, рожденные в Испании в возрасте 20-30 лет?

Спасибо за тонну !!

Ответы [ 5 ]

1 голос
/ 20 июля 2011

У вас действительно испорченный стол. Вы смешиваете несвязанные вещи в стоимости.

Попытка:

SELECT uid
FROM DATABASE a JOIN
  DATABASE b USING (uid)
WHERE a.value IN ('spain', 'male')
  AND b.value >= 20
  AND b.value <= 30
GROUP BY uid
HAVING COUNT(*) >= 2

Обратите внимание, что я сравниваю строку и целое число. Вам нужно будет проверить, насколько хорошо это работает.

Кроме того, я просто соединил Испанию и мужчину, но, может быть, они действительно не связаны?

Определяет ли fid тип значения?

Попробуйте:

SELECT uid
FROM DATABASE country
JOIN DATABASE gender USING (uid)
JOIN DATABASE age USING (uid)
WHERE
  country.fid = 3 AND
  gender.fid = 6 AND
  age.fid = 2 AND
  county.value = 'spain' AND
  gender.value = 'male' AND
  age.value >= 20
  age.value <= 30
GROUP BY uid
HAVING COUNT(*) >= 2

Этот код должен работать более надежно.

1 голос
/ 20 июля 2011

Используйте самостоятельное соединение:

SELECT tland.uid
FROM `table` AS tland
INNER JOIN `table` AS tgender ON tland.uid = tgender.uid
INNER JOIN `table` AS tage ON tland.uid = tage.uid
WHERE tland.value = 'spain'
  AND tgender.value = 'male'
  AND 20 <= tage.value AND tage.value <= 30
0 голосов
/ 20 июля 2011

Поскольку ваши поля отображаются так:

fid 3 = country
fid 2 = age
fid 6 = sex

Вы можете преобразовать эту таблицу в более логичное представление (индексированное по UID)

(SELECT c.uid, c.country, a.age, s.sex FROM
   (SELECT uid, value AS country FROM maintable WHERE fid = 3) c INNER JOIN
   (SELECT uid, value AS age FROM maintable WHERE fid = 2) a ON c.uid = a.uid INNER JOIN
   (SELECT uid, value AS sex FROM maintable WHERE fid = 6) s ON c.uid = s.uid
) as X

Как только оно попадет в представление, вы сможете обрабатывать ваши данные как обычную таблицу. Я предполагаю, что у вас может быть более 3 типов данных, так как fid доходит до 6 на вашем примере.

Предполагая, что вы поместили это в представление (называемое X), вы можете просто сделать:

SELECT * FROM X
WHERE age BETWEEN 20 AND 30
   AND country = 'spain'
   AND sex = 'male'
0 голосов
/ 20 июля 2011

Поддерживая ваш синтаксис настолько близким, насколько это возможно, это может работать:

SELECT uid
FROM database
WHERE value in ('spain', 'male') or convert(value, , SIGNED INTEGER) between 30 and 50
GROUP BY uid HAVING COUNT(*) >= 3
0 голосов
/ 20 июля 2011

Это будет работать.

SELECT d1.uid FROM demo d1
INNER JOIN demo d2 ON d2.uid = d1.uid AND d2.fid = 6 AND d2.value = "Male"
INNER JOIN demo d3 ON d3.uid = d1.uid AND d3.fid = 3 AND d3.value = "Spain"
WHERE (d1.fid = 2 AND (d1.value BETWEEN 20 AND 30))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...