Php 从表中选择两个参数

Php 从表中选择两个参数,php,postgresql,Php,Postgresql,我有一个HTML表单,我可以在URL地址中找到作者的书 url如下所示: 它会检索我的书 我的SQL如下所示: SELECT doc_documents.id doc_id, doc_documents.projection_isbd doc_isbd FROM doc_documents LEFT JOIN doc_document_authors ON doc_document_authors.document_id = doc_documents.id LEF

我有一个HTML表单,我可以在URL地址中找到作者的书

url如下所示: 它会检索我的书

我的SQL如下所示:

SELECT 
  doc_documents.id doc_id, 
  doc_documents.projection_isbd doc_isbd
FROM 
  doc_documents 
  LEFT JOIN doc_document_authors ON doc_document_authors.document_id = doc_documents.id 
  LEFT JOIN usr_users ON usr_users.id = doc_document_authors.user_id 
WHERE 
  doc_documents.status = 'CONFIRMED' AND
  db_type = 'PDB' AND
  deleted = 'f' AND
  usr_users.title ilike $1
ORDER BY
  doc_documents.publish_date desc
SELECT 
      doc_documents.id doc_id, 
      doc_documents.projection_isbd doc_isbd
    FROM 
      doc_documents 
      LEFT JOIN doc_document_authors ON doc_document_authors.document_id = doc_documents.id 
      LEFT JOIN usr_users ON usr_users.id = doc_document_authors.user_id 
    WHERE 
      doc_documents.status = 'CONFIRMED' AND
      db_type = 'PDB' AND
      deleted = 'f' AND
      (usr_users.title ilike $1 AND
       usr_users.title ilike $2)
    ORDER BY
      doc_documents.publish_date desc
其中$1参数来自PHP脚本,其中我从URL获取参数

问题是,我试图找到url中有两个(或更多)作者的书籍,即i。e、 :

我这样尝试sql:

SELECT 
  doc_documents.id doc_id, 
  doc_documents.projection_isbd doc_isbd
FROM 
  doc_documents 
  LEFT JOIN doc_document_authors ON doc_document_authors.document_id = doc_documents.id 
  LEFT JOIN usr_users ON usr_users.id = doc_document_authors.user_id 
WHERE 
  doc_documents.status = 'CONFIRMED' AND
  db_type = 'PDB' AND
  deleted = 'f' AND
  usr_users.title ilike $1
ORDER BY
  doc_documents.publish_date desc
SELECT 
      doc_documents.id doc_id, 
      doc_documents.projection_isbd doc_isbd
    FROM 
      doc_documents 
      LEFT JOIN doc_document_authors ON doc_document_authors.document_id = doc_documents.id 
      LEFT JOIN usr_users ON usr_users.id = doc_document_authors.user_id 
    WHERE 
      doc_documents.status = 'CONFIRMED' AND
      db_type = 'PDB' AND
      deleted = 'f' AND
      (usr_users.title ilike $1 AND
       usr_users.title ilike $2)
    ORDER BY
      doc_documents.publish_date desc
但它不起作用。
你能帮我写一个sql吗?

你能这样试试吗

SELECT 
  doc_documents.id doc_id, 
  doc_documents.projection_isbd doc_isbd
FROM 
  doc_documents 
  LEFT JOIN doc_document_authors ON doc_document_authors.document_id = doc_documents.id 
  LEFT JOIN usr_users ON usr_users.id = doc_document_authors.user_id 
WHERE 
  doc_documents.status = 'CONFIRMED' AND
  db_type = 'PDB' AND
  deleted = 'f' AND
  (usr_users.title ilike $1) OR
  (usr_users.title ilike $2)
ORDER BY
  doc_documents.publish_date desc

你能这样试试吗

SELECT 
  doc_documents.id doc_id, 
  doc_documents.projection_isbd doc_isbd
FROM 
  doc_documents 
  LEFT JOIN doc_document_authors ON doc_document_authors.document_id = doc_documents.id 
  LEFT JOIN usr_users ON usr_users.id = doc_document_authors.user_id 
WHERE 
  doc_documents.status = 'CONFIRMED' AND
  db_type = 'PDB' AND
  deleted = 'f' AND
  (usr_users.title ilike $1) OR
  (usr_users.title ilike $2)
ORDER BY
  doc_documents.publish_date desc
难道不是吗

(usr_users.title ilike $1 OR usr_users.title ilike $2)
而不是

(usr_users.title ilike $1 AND usr_users.title ilike $2)
是吗

(usr_users.title ilike $1 OR usr_users.title ilike $2)
而不是

(usr_users.title ilike $1 AND usr_users.title ilike $2)

不是因为
LIKE
ILIKE
参数必须包含在
%
字符中才能匹配字符串的一部分吗?您还可以尝试使用正则表达式匹配运算符
~
~*
(对于不区分大小写的搜索),它不必使用
%
进行匹配

WHERE(usr\u users.title~*$1)和(usr\u users.title~*$2)

注意:
deleted
字段应该是布尔值或timestamptz,而不是无用的字符,SQL查询通过这种方式变得更具表现力:


WHERE…AND NOT deleted AND…
(布尔值)或
WHERE…AND deleted\u at不为空且…
(时间戳)。

不是因为
LIKE
ILIKE
参数必须包含在
%
字符中才能匹配字符串的一部分吗?您还可以尝试使用正则表达式匹配运算符
~
~*
(对于不区分大小写的搜索),它不必使用
%
进行匹配

WHERE(usr\u users.title~*$1)和(usr\u users.title~*$2)

注意:
deleted
字段应该是布尔值或timestamptz,而不是无用的字符,SQL查询通过这种方式变得更具表现力:


WHERE…AND NOT deleted AND…
(布尔值)或
WHERE…AND deleted_at不为空且…
(时间戳)。

您希望单个用户名(标题)与2个(或更多)模式匹配;这不会发生(除非模式彼此有些相似)

您需要做的(通常)是加入不同的用户(当然,他们是不同的作者)并分别筛选他们:

SELECT    doc_documents.id doc_id,
          doc_documents.projection_isbd doc_isbd
FROM      doc_documents
JOIN      doc_document_authors author1 ON author1.document_id = doc_documents.id
JOIN      doc_document_authors author2 ON author2.document_id = doc_documents.id
JOIN      usr_users user1 ON user1.id = author1.user_id
JOIN      usr_users user2 ON user2.id = author2.user_id
WHERE     doc_documents.status = 'CONFIRMED'
AND       db_type = 'PDB'
AND       NOT deleted
AND       (user1.title ilike $1 AND user2.title ilike $2)
ORDER BY  doc_documents.publish_date desc
当然,当您必须进行N次过滤时,很难概括这一点

另一种可能是在聚合中使用一些:

SELECT    doc_documents.id doc_id,
          doc_documents.projection_isbd doc_isbd
FROM      doc_documents
JOIN      doc_document_authors ON doc_document_authors.document_id = doc_documents.id
JOIN      usr_users ON usr_users.id = doc_document_authors.user_id
WHERE     doc_documents.status = 'CONFIRMED'
AND       db_type = 'PDB'
AND       NOT deleted
GROUP BY  doc_documents.id -- this will only work when id is the primary key
                           -- otherwise use the primary key of doc_documents
                           -- or doc_documents.*
HAVING    bool_or(usr_users.title ilike $1)
AND       bool_or(usr_users.title ilike $2)
ORDER BY  doc_documents.publish_date desc
这将确保每个
usr\u users.title ilike$N
表达式在每个文档的所有作者中(至少1次)
true


还要注意的是,由于您在
中过滤
usr\u用户
,因此没有必要使用
左连接
——您的过滤器将强制执行
内部连接
(或简称
连接
)。

您希望单个用户的姓名(标题)与2个(或更多)模式匹配;这不会发生(除非模式彼此有些相似)

您需要做的(通常)是加入不同的用户(当然,他们是不同的作者)并分别筛选他们:

SELECT    doc_documents.id doc_id,
          doc_documents.projection_isbd doc_isbd
FROM      doc_documents
JOIN      doc_document_authors author1 ON author1.document_id = doc_documents.id
JOIN      doc_document_authors author2 ON author2.document_id = doc_documents.id
JOIN      usr_users user1 ON user1.id = author1.user_id
JOIN      usr_users user2 ON user2.id = author2.user_id
WHERE     doc_documents.status = 'CONFIRMED'
AND       db_type = 'PDB'
AND       NOT deleted
AND       (user1.title ilike $1 AND user2.title ilike $2)
ORDER BY  doc_documents.publish_date desc
当然,当您必须进行N次过滤时,很难概括这一点

另一种可能是在聚合中使用一些:

SELECT    doc_documents.id doc_id,
          doc_documents.projection_isbd doc_isbd
FROM      doc_documents
JOIN      doc_document_authors ON doc_document_authors.document_id = doc_documents.id
JOIN      usr_users ON usr_users.id = doc_document_authors.user_id
WHERE     doc_documents.status = 'CONFIRMED'
AND       db_type = 'PDB'
AND       NOT deleted
GROUP BY  doc_documents.id -- this will only work when id is the primary key
                           -- otherwise use the primary key of doc_documents
                           -- or doc_documents.*
HAVING    bool_or(usr_users.title ilike $1)
AND       bool_or(usr_users.title ilike $2)
ORDER BY  doc_documents.publish_date desc
这将确保每个
usr\u users.title ilike$N
表达式在每个文档的所有作者中(至少1次)
true


还要注意的是,由于您在
中过滤
usr\u用户
,因此没有必要使用
左连接
——您的过滤器将强制执行
内部连接
(或简称
连接
)。

它不会工作:是的,因为您希望单个用户的名称(标题)与2个(或更多)匹配模式;这不会发生(除非模式彼此有些相似)。您真正需要的是加入表(
doc\u document\u authors
usr\u users
)的次数与查询中的author过滤器的次数相同,然后搜索
其中usr\u users1.title-ilike$1和usr\u users2.title-ilike$2和…
尝试了这一点,但没用,我用这个SQL完成了这一点:[选择*FROM elaba.doc\u documents LEFT JOIN elaba.doc\u document\u authors.document\u id=doc\u documents.id LEFT JOIN elaba.usr\u users as auth1.id=doc\u documents\u authors.user\u id LEFT JOIN elaba.usr\u users as auth2.id=doc\u doc\u document\u authors.id LEFT JOIN elaba.usr\u users作为auth3的auth3用户hors.user_id WHERE doc_documents.status='confirm'和db_type='PDB'和deleted='f'和(auth1.title-ilike'Jhon-Smith'和auth2.title-ilike'John-Doe')]您还需要多次加入
doc_document_authors
(您的查询仍然是对同一作者的筛选,但现在已加入多次)。谢谢,这一个很有魅力,这就是我需要的编辑不会起作用:是的,因为您希望单个用户名(标题)与2个(或更多)模式匹配;这不会发生(除非模式彼此有些相似)。您真正需要的是加入您的表(
doc\u document\u authors
usr\u users
)在查询中使用作者筛选器的次数相同,然后搜索
其中usr\u users1.title ilike$1和usr\u users2.title ilike$2和…
尝试了这一点,但没有起作用,我是通过以下SQL完成的:[选择*FROM elaba.doc\u documents LEFT JOIN elaba.doc\u document\u authors.document\u id=doc\u documents.id LEFT JOIN elaba.usr\u users as auth1.id=doc\u documents\u authors.user\u id LEFT JOIN elaba.usr\u users as auth2.id=doc\u doc\u document\u authors.id LEFT JOIN elaba.usr\u users作为auth3的auth3用户hors.user\u id,其中doc\u documents.status=‘已确认’,db\u type=‘PDB’并已删除=