簡體   English   中英

如何 select 基於 SQL/php 中另一列的多個值的列中的單個值

[英]How to select a single value from a column based on multiple values from another column in SQL/php

數據庫不是我的。 結構是

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

字段 ID 是另一個表中的主鍵,我想忘記。 我試圖找到所有具有“西班牙”、“男性”值的 uid

我有以下工作。

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

收獲如下.. 我怎么會 select 男性,價值在 20-30 范圍內的西班牙(即出生在西班牙的男性年齡在 20-30 歲之間?

萬分感謝!!

使用自聯接:

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

你的桌子真的很亂。 你在價值中混合了不相關的東西。

嘗試:

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

請注意,我正在比較一個字符串和一個 integer。 您需要進行測試以查看其效果如何。

另外,我只是把西班牙和男性放在一起,但也許他們真的沒有關系?

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

此代碼應該更可靠地工作。

這將起作用。

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))

使您的語法盡可能接近它的樣子,這可能會起作用:

SELECT uid
FROM database
WHERE value in ('spain', 'male') or convert(value, , SIGNED INTEGER) between 30 and 50
GROUP BY uid HAVING COUNT(*) >= 3

由於您的字段是這樣映射的:

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM