gpt4 book ai didi

mysql - $query 返回结果但不是我想要的结果 - 有计数吗?

转载 作者:行者123 更新时间:2023-11-29 07:10:45 26 4
gpt4 key购买 nike

我会重新开始,

假设我的数据是:

表格元素(id,name,....)


1,命名元素 1,....

2,命名元素 2,....

3,命名元素 3,....

表格标签(id,name,id_element, ....)


1,快乐,1

2,结果,1

3,非常,1

4,元素,2

5、另一个、3

6,元素,1

7,快乐,2

所以如果搜索是“very, happy,element,result”:我想要的结果


1) id = 2 的元素,因为它有所有标签

2) id = 1 的元素,因为它有标签“element”和标签“happy”(只少了 2 个标签)

3) ....(只少了 3 个标签)

所以如果搜索是“happy,element”:我想要的结果


1) id = 1 的元素,因为它有所有标签(没有更多)

2) id = 2 的元素,因为它有标签“element”和标签“happy”(以及另外两个标签)

3) .... 以及另外 3 个标签


这是对我查询的回应:(它不符合我写的所有要求,但它的第一个测试是找到匹配的标签)

SELECT element.id as id_deseada,tagg.* FROM element,tagg WHERE tagg.id_element = element.id AND tagg.nombre IN ('happy','tagg','result') GROUP BY tagg.id_element ORDER BY element.votos 

这会返回 10 个重复的元素...:S 并且甚至没有所有的标签(并且在数据库中有带有“快乐”结果的标签)


如果有帮助,这就是我获取标签元素的方式(通过名称和只有一个标签)

$query = "SELECT element.id FROM element,tagg WHERE tagg.nombre = '$nombre_tagg' AND tagg.id_element = element.id  AND lan = '$lan' GROUP BY tagg.id_element";

我希望现在更容易理解,请原谅我的英语.. :)

-------- 编辑------------

我得到了这个查询,来自:http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html (第二个例子是我的结构)

    SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId
HAVING COUNT( b.bId )=3

假设书签是元素,类别是标签(以我为例)

效果很好,它返回带有所有标签的所有元素,但它也返回带有额外标签的文章,

对于该查询,可能的结果是:

带标签的元素 6(bookmark、webserbice、semweb、extartag)

我想要这个额外的标签(实际上是任何其他额外的标签),与 HAVING COUNT 有关吗?

我知道

非常感谢您可能的分配!

最佳答案

如果我理解正确的话,你有一个多对多的关系,你想在同一个字段上同时满足多个条件。

为此,您需要使用 MySQL 的 HAVING 子句。由于我不知道你的数据库结构,我会为这个例子做一个。

对象

+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| object_id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(255) | NO | | NULL | |
| otherfield | text | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+

标签

+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| tag_id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
+--------+--------------+------+-----+---------+----------------+

object_tag

+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| object_id | int(11) | NO | | NULL | |
| tag_id | int(11) | NO | | NULL | |
+-----------+---------+------+-----+---------+-------+

现在,要检索一个对象及其所有标签,您可以这样做:

SELECT object.*,tag.name as tag FROM object 
LEFT JOIN object_tag ON object_tag.object_id = object.object_id
LEFT JOIN tag ON object_tag.tag_id = tag.tag_id

这给你类似的东西:

+-----------+-----------+------------+------+
| object_id | title | otherfield | tag |
+-----------+-----------+------------+------+
| 1 | My object | something | foo |
| 1 | My object | something | bar |
| 1 | My object | something | baz |
+-----------+-----------+------------+------+

现在,由于您不能执行 WHERE tag='foo' AND tag='bar',因为它不可能匹配,所以您必须使用 HAVING 子句.

SELECT object.* FROM object 
LEFT JOIN object_tag ON object_tag.object_id = object.object_id
LEFT JOIN tag ON object_tag.tag_id = tag.tag_id
WHERE tag.name IN ('foo', 'bar')
GROUP BY object.object_id
HAVING COUNT(1) >= 2;

现在这会给你:

+-----------+-----------+------------+
| object_id | title | otherfield |
+-----------+-----------+------------+
| 1 | My object | something |
+-----------+-----------+------------+

HAVING 子句告诉 MySQL 仅当 2 个或更多标签(COUNT(1) >= 2)与结果集匹配时才返回。

关于mysql - $query 返回结果但不是我想要的结果 - 有计数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4700219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com