【问题标题】:Selecting by details with MySQL, after join [closed]加入后使用MySQL按详细信息选择[关闭]
【发布时间】:2017-08-24 12:00:15
【问题描述】:

首先我将介绍我想要实现的目标以及我是如何做到的。

我有三个表,PostsDetailsPosts_Details

Posts 是我保存基本帖子数据的表,Details 是保存详细信息实例,其中包含有关详细信息标题的信息、可能的值以及如果需要输入详细信息时的一些信息,显示标志Posts_Details 是表示M->N 关系的实体,它保留一个详细信息的值,因此它具有三个属性,即帖子和详细信息的 id 对和一个值。

我要设置的是搜索功能。

搜索的第一部分很简单,我使用Posts.title LIKE '%?%',客户对它的运行方式很满意,我知道它的局限性,但目前这只是基本的搜索功能。下一个功能给我带来了麻烦,因为我不知道如何正确地建立关系,而且我已经落后于停止工作和阅读关系的计划。

我需要创建一个像“高级搜索”这样的功能,用户不仅可以选择类别和标题关键字,还可以将详细信息与下拉输入相匹配。我正在使用 PHP 和 PDO,但我认为这在这里并不太相关,因为我的问题与 SQL 更相关。

我如何尝试解决这个问题 - 我正在解析获取数据并将其收集到一个关联数组中,其中详细信息 id 作为键,值作为值,所以我想遍历数组并将规则附加到 WHERE SQL 字符串的一部分。在我解析捣碎的列之后,我用这种方法得到了一些结果,但感觉不对,我觉得我只是在做一些修改。

是否有一种“更正确”的方式来实现这种按详细信息进行搜索,我将制定一个规则,在三个表连接后从详细信息列表中选择具有值的帖子?

【问题讨论】:

  • 我想很容易将帖子拒之门外,但如果你告诉我是什么让这个问题成为一个愚蠢的问题以及如何改进它或者我做错了什么,我将不胜感激......
  • 您需要提供有关表结构的更多详细信息。另外,什么是“细节”?您听起来像是一个属性(例如“blue”或“size 34”),因为您通过 id 而不是内容来引用它们,但更多...详细信息...会有所帮助。
  • 但我确实解释了结构 - 详细信息保留了详细信息实例,其中包含有关详细信息标题、可能值和一些信息(如果输入、显示标志等需要详细信息)的信息。我只是省略了上下文和内容,因为我认为它与主题无关

标签: php mysql sql database pdo


【解决方案1】:

您可以使用子选择。

SELECT p.*, d.* FROM ... -- Existing Join
WHERE ... -- Existing Criteria
OR p.id IN (SELECT posts_id FROM Posts_Details WHERE detail like ?)

【讨论】:

  • 漂亮,更好看,谢谢。
  • 当然。顺便说一句——如果您的客户可以接受“?%”而不是“%?%”,您通常可以从根本上提高性能。
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多