有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