有2個引用(user_id
和item_id
),我需要查詢找到與某些項目的所有用戶一個表排序。 棘手的部分是,我需要根據結果排序結果,而不僅僅是結果的數量,而是基於它們的WHICH項目。從單一的表中返回結果由我多少結果
這裏的表:
+--------------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-----------------------+------+-----+---------+-------+
| user_id | int(11) | NO | | 0 | |
| item_id | int(11) unsigned | YES | | NULL | |
+--------------+-----------------------+------+-----+---------+-------+
所以我的查詢如下所示:
SELECT user_id, item_id
FROM user_items
WHERE item_id IN (2, 122, 132)
GROUP BY user_id, item_id
HAVING SUM(item_id = 2);
看起來很容易嗎?這裏是艱難的部分進來:
item_id = 2是必需的 item_id = 122和132是可選的。 132之後的任何內容也是可選的。
我需要基於訂購的結果: 1)如果所有的項目被發現。 2)如果僅找到項目2和122。 3)如果只找到第2項。
下面是擺弄的SQL小提琴文件:http://sqlfiddle.com/#!2/6b1c1/6/0
我在想,如果有一些方法我可以設置的,這樣的事情:SELECT查詢說
IF (item_id = 2 AND item_id = 122 AND item_id = 132) AS matches_all,
IF (item_id = 2, item_id = 122) AS matches_some,
IF (item_id = 2) AS matches_first
編輯與更新查詢 這是我迄今爲止。它是我所需要的約95%: http://sqlfiddle.com/#!2/6b1c1/47
SELECT user_id, item_id,
@tmp_1 := IF(SUM(item_id = 2), 1, 0) AS tmp_1,
@tmp_2 := IF(SUM(item_id = 122), 1, 0) AS tmp_2,
@tmp_3 := IF(SUM(item_id = 132), 1, 0) AS tmp_3,
@tmp_4 := IF(SUM(item_id = 126), 1, 0) AS tmp_4,
CAST(@tmp_3 + @tmp_4 AS UNSIGNED) AS total_other
FROM user_items
WHERE item_id IN (2, 122, 132, 126)
GROUP BY user_id
HAVING SUM(item_id = 2)
ORDER BY tmp_1 DESC, tmp_2 DESC, total_other DESC
一對夫婦更多的細節:
1)我只會有一個最大的12個項目進入,所以我可以指定每一個它自己的溫度場如果需要的話。
2)上面的查詢完全適用於tmp_1和TMP_2。如果我們有一個擁有第2項和第122項的用戶,它將這些放在列表的頂部。 對於剩下的,3-4(3至最多12個),我需要匹配的數目,這就是爲什麼在我CAST(@tmp_3 + @tmp_4
做出了嘗試的計算。我不知道如何讓這些計算。
3)一旦我有項目3的總計算 - 12,則這將是ORDER BY
子句中的第三個和最後一個項目。
結果示例 基於在SQL小提琴文件中提供的模式,這裏要說的是,應根據搜索與ITEM_ID所有用戶返回的結果'S:2, 122, 132, 126
+---------+--------------+----------------+-------------+
| USER_ID | PRIMARY_ITEM | SECONDARY_ITEM | OTHER_ITEMS |
+---------+--------------+----------------+-------------+
| 39 | 1 | 1 | 2 |
| 54 | 1 | 1 | 0 |
| 55 | 1 | 0 | 0 |
+---------+--------------+----------------+-------------+
您的查詢總廢話:'HAVING SUM(ITEM_ID = 2)'? – Bohemian
老兄!如果你有更好的東西,請告訴我!我沒有發佈我的問題,因爲我的查詢是完美的。我正在嘗試做一些我無法弄清楚如何去做的事情。查看SQLFiddle鏈接以瞭解它是如何工作的。 'HAVING SUM(item_id = 2)'只是確保item_id 2存在於結果中。 –
'HAVING SUM(item_id = 2)'不一定是「無稽之談」。這個特殊的表達式可能不會達到理想的結果集,但像這樣的表達式通常是有效的,有時是有用的,偶爾也是不可或缺的。 – spencer7593