假設我有一張以food_prefs朋友和他們最喜歡的食物命名的桌子。
| ID | 名稱 | 最喜歡的_食物 |
|---|---|---|
| 1 | 艾米 | 比薩 |
| 2 | 鮑勃 | 比薩 |
| 3 | 乍得 | 魚子醬 |
| 4 | 達娜 | 比薩 |
| 5 | 達娜 | 沙拉 |
我知道如何獲得喜歡比薩餅的每個人的名字,但我不清楚如何選擇僅pizza列為他們最喜歡的食物的人。也就是說,從上表中,我只想選擇 Amy 和 Bob。
此外,如果有一個解決方案也可以選擇具有多個收藏夾的名稱(例如,在另一個查詢中選擇所有收藏夾的名字,這將是很好的選擇pizza and salad)。最后,如果pizza and salad查詢不僅回傳只喜歡這兩種食物的人,而且回傳串列中只有一個最喜歡的人(例如,只喜歡比薩餅或只喜歡沙拉的人——在這個例子中除了乍得之外的所有人),這可能會很有用)
(我發現 sqlite 檔案不是最簡單的,如果這是一個非常簡單的問題,很抱歉!)
uj5u.com熱心網友回復:
你是對的(正如我在你的問題下面的評論中讀到的),對于你的要求,你需要聚合和HAVING條款中的條件。
例如,要讓只將“披薩”列為他們最喜歡的食物的人:
SELECT name
FROM food_prefs
GROUP BY name
HAVING GROUP_CONCAT(favorite_foods) = 'Pizza';
但是,如果您想讓那些只將“比薩餅”和“沙拉”列為他們最喜歡的食物的人,請執行以下操作:
HAVING GROUP_CONCAT(favorite_foods) = 'Pizza,Salad'
可能不起作用,因為 SQLite 不支持ORDER BYfunction 中的子句GROUP_CONCAT(),因此不能保證它會回傳'Pizza,Salad'(它也可能 return 'Salad,Pizza')。
在這種情況下,您需要一個更復雜的HAVING子句:
HAVING SUM(favorite_foods IN ('Pizza', 'Salad')) = 2
AND SUM(favorite_foods NOT IN ('Pizza', 'Salad')) = 0
或者:
HAVING SUM(favorite_foods IN ('Pizza', 'Salad')) = 2
AND COUNT(*) = 2
我假設的組合name和favorite_foods獨特。
對于將“披薩”和/或“沙拉”列為他們最喜歡的食物,但他們也可能列出其他食物的人,您只需要一個WHERE子句而不是聚合:
SELECT DISTINCT name
FROM food_prefs
WHERE favorite_foods IN ('Pizza', 'Salad');
uj5u.com熱心網友回復:
(在這里OP)EXCEPT似乎可以解決問題:
SELECT name
FROM food_prefs
WHERE favorite_foods in ('pizza', 'salad')
EXCEPT
SELECT name
FROM food_prefs
WHERE favorite_foods not in ('pizza', 'salad')
據我了解,它會選擇name我們選項串列中所有喜歡食物的s,然后洗掉name該串列之外的所有喜歡食物的s(在上面的示例中,('pizza', 'salad'))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385862.html
標籤:Python sqlite 通过...分组 组连接 有
