gpt4 book ai didi

php - Mysql Join Query 多次给出相同的结果

转载 作者:可可西里 更新时间:2023-11-01 08:22:54 24 4
gpt4 key购买 nike

我有两张 table 。一种是items,一种是tags。查询的 here .

想法是创建一个搜索框来搜索项目,然后通过选择标签来缩小搜索范围。 (某种分面搜索)。

在摆弄 mysql 教程之后,我想到了这个:

SELECT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc`
FROM `items`LEFT JOIN (`tags`) ON (`tags`.`item_id`=`items`.`id`)
WHERE (
(`tags`.`type`='food' AND `tags`.`name`='pizza')
OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade')
--And so on for every tag
)
ORDER BY `pay` DESC LIMIT 0 , 30

(我删除了查询中的全文搜索,因为它现在不相关)

它工作得很好,但我有两个问题:

  1. 如果用户未选择任何标签,则附加了超过 1 个标签的每个项目都会显示超过 1 次
  2. 如果用户选择两个标签,例如 food=>pizza 和 drinks=>lemonade,则每一个带有 pizza 或 lemonade 或两者的项目都会显示,我只想要附加了这两个标签的项目。<

是否可以使用不同的 mysql 查询来解决这些问题?或者我应该在 php 代码中解决这些问题。 (或者我这样做完全错了,有没有更好的标签使用方法?)

希望我说清楚了。

格,

基础

最佳答案

在 SELECT 后面加上关键字 DISTINCT?

SELECT DISTINCT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc` 
FROM `items`LEFT JOIN (`tags`) ON (`tags`.`item_id`=`items`.`id`)
WHERE (
(`tags`.`type`='food' AND `tags`.`name`='pizza')
OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade')
--And so on for every tag
)
ORDER BY `pay` DESC LIMIT 0 , 30

至于你的第二个问题……你的逻辑是错误的。如果我对你的理解正确,你想按 items.id 分组,然后拒绝返回的行数与所选标签数不同的项目......可能是这样的:

SELECT DISTINCT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc` 
FROM `items`LEFT JOIN (`tags`) ON (`tags`.`item_id`=`items`.`id`)
WHERE (
(`tags`.`type`='food' AND `tags`.`name`='pizza')
OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade')
--And so on for every tag
)
GROUP BY `items`.`id`
HAVING COUNT(*) = 2
ORDER BY `pay` DESC LIMIT 0 , 30

... 并将 HAVING COUNT(*) = 2 中的 2 替换为您尝试同时匹配的标签数量 ...

关于php - Mysql Join Query 多次给出相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2312462/

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