Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 2

0
votes
answers
51 views
+10

POSTGRES:如何做循環和如何加入循環內?

0

SQL新手在這裏。POSTGRES:如何做循環和如何加入循環內?

我有兩個表像這些

表:訂單

enter image description here

CREATE TABLE orders (
ID serial NOT NULL PRIMARY KEY, 
data json NOT NULL 
); 

INSERT INTO orders (data) 
VALUES 
(
'{"customer":"John Doe","items":[{"1234":{"attributes":{"name":"parent"}},"id":"1234","isPhone":true,"items":[{"5678":{"attributes":{"name":"child"}},"id":"5678","isPhone":false}]},{"9012":{"attributes":{"name":"parent"}},"id":"9012","isPhone":true,"items":[{"3456":{"attributes":{"name":"child"}},"id":"3456","isPhone":false}]}]}' 
); 

INSERT INTO orders (data) 
VALUES 
(
'{"customer":"John Doe","items":[{"7890":{"attributes":{"name":"parent"}},"id":"7890","isPhone":true,"items":[{"0987":{"attributes":{"name":"child"}},"id":"0987","isPhone":false}]},{"6543":{"attributes":{"name":"parent"}},"id":"6543","isPhone":true,"items":[{"2109":{"attributes":{"name":"child"}},"id":"2109","isPhone":false}]}]}' 
); 

表:積壓

enter image description here

CREATE TABLE backlog (
ID serial NOT NULL PRIMARY KEY, 
data json NOT NULL 
); 

    INSERT INTO backlog (data) 
VALUES 
('{"id":"5678","isAvailable":true,"order_id":1}'), 
('{"id":"9012","isAvailable":true,"order_id":1}'), 
('{"id":"3456","isAvailable":false,"order_id":1}'), 
('{"id":"7890","isAvailable":false,"order_id":2}'), 
('{"id":"0987","isAvailable":false,"order_id":2}'), 
('{"id":"6543","isAvailable":false,"order_id":2}'), 
('{"id":"2109","isAvailable":false,"order_id":2}'), 
('{"id":"1234","isAvailable":true,"order_id":1}') 

現在我需要每個order.data.items陣列裏面循環遞歸以獲得兩家母公司&子項的id和做基礎上,Backlog.data.id聯接積壓表

最終輸出喜歡被

enter image description here

如果我沒有正確地解釋我的需求,請評論我會努力讓儘可能多詳細。

在此先感謝。

+2

如果這是一個SQL數據庫,我會建議你改變你的數據結構。這看起來更像NoSQL數據庫。 –

+0

postgres有jsonb支持,所以去了SQL有nosql支持。 – Sathish

+1

僅僅因爲Postgres具有相當不錯的JSON/NoSQL支持,並不意味着規則或適當的數據庫設計應該被拋棄。不要對所有東西都使用JSON。使用正確的標準化模型,這與加入兩個表格一樣簡單。見例如這裏:https://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary-jsonhstore-dynamic-columns/ –

沙发
0
0

你可以用子查詢(或CTE)和generate_series()來做到這一點。

select baz from (select o.data->'items'->generate_series(0, json_array_length(o.data->'items') - 1)->>'id' as foo, b.data->>'id' as bar, b.data as baz from orders as o, backlog as b) as t where foo = bar; 

這將返回

      baz       
----------------------------------------------------- 
{"id": "9012", "order_id": 1, "isAvailable": true} 
{"id": "7890", "order_id": 2, "isAvailable": false} 
{"id": "6543", "order_id": 2, "isAvailable": false} 
{"id": "1234", "order_id": 1, "isAvailable": true} 
(4 rows) 

解構和理解我的查詢被留作練習。

和閱讀文檔: https://www.postgresql.org/docs/current/static/functions-json.html

+0

我很可能沒有得到您父母和孩子的所有要求,但我希望這能讓您走上正確的道路。 –

0
votes
answers
57 views
+10

Postgres加入不正確的更新

0

我想在Postgres上運行一些更新查詢,這些查詢是在公共字段上加入表的。這是用SQL Server運行的,更新計數是1,這是預期的,而postgres的更新計數是3.似乎postgres不執行隱式連接,當目標表與連接中涉及的源表名稱相同時。該腳本可以更DESCRIPT比在說什麼,那就是:Postgres加入不正確的更新

drop table test; 
drop table test2; 
create table test(col1 int, col2 varchar(10)); 
insert into test values(1, 'aaa'); 
insert into test values(2, 'bbb'); 
insert into test values(3, 'ccc'); 
create table test2(col1 int); 
insert into test2 values(2); 
select * from test; 
select * from test2; 

// Select join = rowcount 1 
select count(*) from test t2, test2 t3 
where t2.col1 = t3.col1; 

// SQL Server update = 1; postgres =3 
update test set col2 = 'changed' 
from test t2, test2 t3 
where t2.col1 = t3.col1; 

上面的查詢可以簡化爲:

update test set col2 = 'changed' 
from test2 where test.col1 = test2.col1; 

但是這不是我的本意爲加盟條款可能涉及一些更多的聯合聲明。 期望意圖是運行這樣的查詢:

UPDATE IDMAP_CHILD_JOBID SET RESTORESUCCESS = IDMAP_TABLE_JOBID.RESTORESUCCESS, RESTOREERRMSG = IDMAP_TABLE_JOBID.RESTOREERRMSG 
FROM CHILD, IDMAP_TABLE_JOBID 
WHERE CHILD.ID = IDMAP_CHILD_JOBID.OLDID AND CHILD.FK1 = IDMAP_TABLE_JOBID.OLDID 
AND IDMAP_TABLE_JOBID.RESTORESUCCESS = $FALSE 

Postgres的與表抱怨指定多次如果IDMAP_CHILD_JOBID相同IDMAP_TABLE_JOBID更多。這怎麼可以重寫? 我的應用程序應該生成一個更新語句,這是統一的查詢應該運行,而行爲是不同的。顯然,加入是在選擇時執行的,而不是正在更新。

+1

[從手動報價](https://www.postgresql.org/docs/current/static/sql-update.html):「*注意,目標表必須** **未出現在from_list ,除非你打算自我加入*「。你需要從'FROM'部分 –

+0

刪除''IDMAP_TABLE_JOBID'一些聯接statements'有沒有這樣的事,作爲一個* JOIN語句*。 JOIN是一個二元**運算符**,它的操作數是兩個表(表達式),其結果是一個表表達式。 – wildplasser

+0

@wildplasser我離題了。 SQL Server更新可以運行JOIN。可能不會使用術語,但可以通過SELECT with JOINS獲得相似性。 – dmachop

沙发
0
1

如果您需要引用同一個表兩次(或更多),你需要給他們不同的別名,讓您可以參考他們每個人:


update test t1 
set col2 = 'changed' 
from test t2 --  <<-- same table !! 
JOIN test2 t3 ON t2.col1 = t3.col1; 
where t1.something =t3.something  --<<-- link the target to the source 
     ; 

UPDATE idmap_child_jobid dst -- <<-- alias=dst 
SET restoresuccess = src.restoresuccess 
, restoreerrmsg = i.restoreerrmsg 
FROM idmap_table_jobid src -- <<-- same table, different alias=src 
JOIN child c ON c.fk1 = src.oldid 
WHERE c.id = dst.oldid 
AND dst.restoresuccess = false 
     ; 

[未經檢驗的,因爲我不知道該表的定義,或者INTEN查詢系統蒸發散]


This is run with SQL Server

SQL服務器有一個稍微不同的語法(和語義)更新,在:

UPDATE test 
SET field= 'OMG' 
FROM test t1 
JOIN othertable t2 ON t1.field = t2.field 
    ; 

...有只有兩張表在範圍表中;即使test被提到了兩次,這是相同的實體)這是微軟/的Sybase 功能

+0

反芻剛纔你所說的一切: 的Postgres 更新測試d 集COL2 =從測試T1「改爲」 ,test2的T 2,其中t1.col1 = t2.col1和d .something = t2.something; SQL服務器 更新d 組d.col2 = '改爲' 從測試d,測試T1,T2 TEST2其中t1.col1 = t2.col1和d.something = t2.something; – dmachop

+0

我正在寫不得不產生這樣的SQL語句的方法和這一標準少UPDATE語句加入似乎是一場噩夢 !例如: 字符串updateOnJoin(字符串destTable,集<一對<字符串,字符串>> setPairs,收藏個fromTables,收集<配對<字符串,字符串>> joinStatements) 每呼叫者不得不產生別名和構建這似乎是一個難於編碼方式的方法:( – dmachop

板凳
0
0

對於這個SQL查詢:

update test 
    set col2 = 'changed' 
    from test t2, test2 t3 
    where t2.col1 = t3.col1; 

等效Postgres的語法是:

update test 
    set col2 = 'changed' 
    from test2 t3 
    where test.col1 = t3.col1; 

update/join語法是在兩個數據庫不同(雖然我覺得上面還將努力在SQL Server)。

+0

這不是我的意圖。這是我想要做的簡化。在我的問題UPDATE IDMAP_CHILD_JOBID SET RESTORESUCCESS = IDMAP_TABLE_JOBID.RESTORESUCCESS,RESTOREERRMSG = IDMAP_TABLE_JOBID.RESTOREERRMSG 從子,IDMAP_TABLE_JOBID WHERE CHILD.ID = IDMAP_CHILD_JOBID.OLDID AND CHILD.FK1 = IDMAP_TABLE_JOBID.OLDID AND IDMAP_TABLE_JOBID.RESTORESUCCESS = $ FALSE最終查詢是我的本意,但似乎沒有要在SQL服務器和Postgres使用方式時IDMAP_TABLE_JOBID相同IDMAP_CHILD_JOBID。這個度假勝地別名具有兩種不同的語法:( – dmachop

地板
0
0

我有點困惑,似乎有 3 tables: IDMAP_CHILD_JOBID, CHILD, IDMAP_TABLE_JOBID

簡體查詢(SQry) 2 tables: test,test2和 最終查詢(FQry)之間的差異要更新SQry單列:(注意,T1別名希望防止table specified more than once錯誤)

update test t1 
    set col2 = 'changed' 
    from test t2, test2 t3 
where t2.col1 = t3.col1 
    and t1.col1 = t3.col1; 

所以FQry將更新行從該查詢返回的,如果有在IDMAP_CHILD_JOBID多行匹配CHILD.ID其中,他們都將得到更新。

select IDMAP_CHILD_JOBID.RESTORESUCCESS, 
     IDMAP_TABLE_JOBID.RESTORESUCCESS, RESTOREERRMSG, 
     IDMAP_TABLE_JOBID.RESTOREERRMSG 
FROM IDMAP_CHILD_JOBID, CHILD, IDMAP_TABLE_JOBID 
WHERE CHILD.ID = IDMAP_CHILD_JOBID.OLDID 
    AND CHILD.FK1 = IDMAP_TABLE_JOBID.OLDID 
    AND IDMAP_TABLE_JOBID.RESTORESUCCESS = $FALSE 
0
votes
answers
63 views
+10

是否在CA-central-1區域中提供AWS Aurora for PostgreSQL?

1

我試圖通過亞馬遜的網絡界面在ca-central-1(加拿大)設置一個Aurora PostgreSQL數據庫,但儀表板只給我選擇Aurora MySQL的選項。是否在CA-central-1區域中提供AWS Aurora for PostgreSQL?

Aurora PostgreSQL兼容實例在加拿大還沒有提供,或者這是亞馬遜網絡界面中的錯誤?

沙发
0
2

Aurora Postgres SQL兼容性實例在加拿大尚未提供。您可以參考pricing page來查找各個數據庫引擎的可用性。

0
votes
answers
38 views
+10

錯誤的計算由用戶定義的SQL函數

1

我有一個功能,通過錯誤的計算由用戶定義的SQL函數

CREATE OR REPLACE FUNCTION public.div(dividend INTEGER, divisor INTEGER) 
    RETURNS INTEGER 
    LANGUAGE 'sql' 
    IMMUTABLE 
    LEAKPROOF 
    STRICT 
    SECURITY DEFINER 
    PARALLEL SAFE 
    AS $BODY$ 
     SELECT ($1 + $2/2)/$2; 
    $BODY$; 

應該算一個商業四捨五入的結果確定。大多數情況下,它完成這項工作。我不知道爲什麼,但select div(5, 3)給了我正確的答案,而當一個參數通過聚合來計算時,例如select div(5, 3)select div(sum(val), 3) from (select 1 as val UNION SELECT 4) list足以觸發這一點。 我該如何修復div?我不想投入每一個輸入。

順便說一下,使用SELECT (cast($1 as integer) + cast($2 as integer)/2)/cast($2 as integer);作爲div的定義沒有幫助。

沙发
0
1

更改函數的名稱。

功能div(numeric, numeric)是一個內建的Postgres功能,有你要調用其功能的歧義:

select div(5, 3)   -- calls your function public.div(integer, integer) 
select div(5::bigint, 3) -- calls pg_catalog.div(numeric, numeric) 

在第二種情況下的參數必須解決和系統功能被選爲第一。

請注意,函數sum(integer)給出bigint作爲結果。

+0

太糟糕了,我沒有想到這一點。謝謝。 – Bolpat

板凳
0
1

允許浮點數作爲參數,然後在計算時顯式強制轉換,否則在傳遞參數時有隱式轉換。

CREATE OR REPLACE FUNCTION my_div(dividend FLOAT, divisor FLOAT) 
    RETURNS INTEGER 
    LANGUAGE 'sql' 
    IMMUTABLE 
    -- LEAKPROOF -- not allowed at dbfiddle.uk 
    STRICT 
    SECURITY DEFINER 
    PARALLEL SAFE 
    AS $BODY$ 
     SELECT --($1 + $2/2)/$2; 
      (cast($1 as integer) + cast($2 as integer)/2)/cast($2 as integer) 
    $BODY$; 
 
? 
select my_div(sum(val), 3) 
from (select 1 as val UNION SELECT 4) x 
 
| my_div | 
| -----: | 
|  2 | 

dbfiddle here

0
votes
answers
52 views
+10

計數的另一個表引用列

0

我真的不知道,以這個稱號,但是這是我想要做的事:計數的另一個表引用列

我有隊的一個表:

teamid | city | name 

和我都玩過的遊戲表:

gameid | teamid | points 

我試圖做的是相符的由「猛龍」玩過的所有遊戲得分的總點數。

我試着這樣說:

SELECT COUNT(points) AS "Raptors Points" FROM TEAMS, GAMES 
    WHERE name = 'Raptors' AND TEAMS.teamid = GAMES.teamid; 

和這樣:

SELECT COUNT(points) AS "Raptors Points" FROM (SELECT * FROM 
    TEAMS JOIN GAMES ON TEAMS.teamid = GAMES.teamid WHERE 
    name = 'Raptors') AS foo; 

兩個結果從遊戲之一(第一個)只顯示點表,而不是來自所有遊戲的總數。

我真的很難過我做錯了什麼。有什麼建議麼?

感謝

沙发
0
2

最有可能你所看到的錯誤值,並認爲它是一個合適的值。您需要更改COUNT(points)SUM(points)

計數會給你的記錄總數,SUM會給你點

總數BTW第一個查詢應該工作,如果你修復

+0

啊什麼愚蠢的錯誤:(謝謝! – Strobe00

0
votes
answers
77 views
+10

錯誤時,在Linux Mint的安裝PostgreSQL薩拉

0

我想在我的電腦Linux Mint的薩拉安裝PostgreSQL和我完成程序安裝,但是當我在CMD Postgres的錯誤類型psql的,就像這樣:錯誤時,在Linux Mint的安裝PostgreSQL薩拉

錯誤時安裝PostgreSQL

PSQL:無法連接到服務器:沒有這樣的文件或目錄 是服務器本地運行和驗收Unix域套接字「/var/run/postgresql/.s.PGSQL.5432」 連接?

我該如何解決? 謝謝

沙发
0
1

錯誤指出psql實用程序無法找到連接到您的數據庫服務器的套接字。

要麼您沒有在後臺運行數據庫服務,要麼套接字位於其他位置,或者可能需要修復pg_hba.conf。

步驟1:驗證數據庫運行

該命令可以根據操作系統的不同而不同。但是,在大多數* IX系統下面會的工作,它將爲Postgres的所有正在運行的進程

ps -ef | grep postgres 

在我的系統中進行搜索,Mac OSX版,這個吐出

501 408  1 0 2Jul15 ??   0:21.63 /usr/local/opt/postgresql/bin/postgres -D /usr/local/var/postgres -r /usr/local/var/postgres/server.log 

最後一列顯示的命令用於啓動服務器和選項。

您可以使用以下命令查看可用於啓動postgres服務器的所有選項。

man postgres 

從那裏,你會看到的選項-D和-r分別是DATADIR &的日誌文件名。 第2步:如果Postgres服務運行

使用find搜索插座的位置,這應該是某個地方在/ tmp

sudo find /tmp/ -name .s.PGSQL.5432 

如果Postgres的運行並接受套接字連接,上面應該告訴你插座的位置。在我的機器,它竟然是:

/tmp/.s.PGSQL.5432 

然後,嘗試使用此文件的位置明確,例如,通過PSQL連接。

psql -h /tmp/ dbname 

步驟3:如果該服務正在運行,但看不到一個插座

如果你找不到插座,但看到該服務正在運行,驗證pg_hba.conf文件允許本地套接字。

瀏覽到datadir,你應該找到pg_hba.conf文件。

默認情況下,接近該文件的底部,您應該看到以下行:

# "local" is for Unix domain socket connections only 
local  all  all  trust 

如果你沒有看到它,你可以修改該文件,並重新啓動Postgres的服務。

0
votes
answers
46 views
+10

MYSQL創建表,約束,外鍵

2

我正在關注一個關於SQL的UDEMY課程。教師正在使用postgresql。我在MySQL工作臺上工作。我們的企業發展是在AWS平臺上的MySQL 5.6中進行的。所以我想在MySQL中學習。MYSQL創建表,約束,外鍵

有關於「創建表」和使用約束和外鍵命令鏈接兩個不同表中的主鍵的講座。這是我想要處理的數據,所以挑戰是相關的。教練的代碼不會爲我編譯。我得到「錯誤代碼1215.無法添加外鍵約束」。

我在這裏讀到變量必須有完全相同的定義。於是我把教師的表從「serial」改爲int。我仍然收到錯誤。我試圖簡化代碼。我還沒有到達任何地方。任何人都可以幫助我理解它爲什麼不執行?

create table if not exists accounts(

user_id INT auto_increment not null, 
username varchar(50) unique not null, 
password varchar(50) not null, 
email varchar(350) unique not null, 
created_on timestamp not null, 
last_login timestamp, 
primary key (user_id) 
); 


create table if not exists role(
role_id INT auto_increment not null, 
role_name varchar(250) unique not null, 
PRIMARY KEY (role_id) 
); 

create table accounts_role(
user_id INT, 
role_id INT, 
grant_date timestamp, 
primary key (user_id, role_id), 

constraint accounts_role_role_id_fkey foreign key (role_id) 
    references role(role_id) match simple 
    on update no action 
    on delete no action, 

constraint accounts_role_user_id_fkey foreign key (user_id) 
    references account (user_id) MATCH SIMPLE 
    on update no action 
    on delete no action 
); 
+0

能否請編輯您的帖子,選擇所有的SQL代碼,然後按{}文本框上方的按鈕將其格式化爲代碼。我會爲你做,但這個按鈕不會顯示在iPhone上:( –

+0

我主要與其他品牌的數據庫一起工作,但添加外鍵的語法看起來像缺少一些關鍵字。要添加一個fk到現有的表,你需要發出一個查詢看起來更像ALTER TABLE blah ADD CONSTRAINT constraintname FOREIGN KEY等等 - 看到https://stackoverflow.com/questions/10028214/add-foreign-key-to-existingtable或類似。基本上,試着在你的代碼中的CONSTRAINT之前添加'ALTER TABLE blah ADD'。確保在外鍵引用的列被索引 –

沙发
0
1

好傷心。
謝謝蔡斯,我正在實施你的建議,我找到了我的問題的答案。

我意識到,我的表名爲「賬戶」和我創建的「帳戶」的限制......

create table accounts_role(
user_id INT, 
role_id INT, 
grant_date timestamp, 
primary key (user_id, role_id), 

constraint accounts_role_role_id_fkey foreign key (role_id) 
    references role(role_id) match simple 
    on update no action 
    on delete no action, 

constraint accounts_role_user_id_fkey foreign key (user_id) 
    references accounts(user_id) MATCH SIMPLE 
    on update no action 
    on delete no action 
); 
0
votes
answers
51 views
+10

PGSQL通過每個用戶名中的特定字母來查詢排序

1

我必須編寫一個查詢來排序(按順序排列)我的用戶名,使用特定字母進行排序的方式優先(名稱內)。 例如,如果我有用戶檸檬,Loger,艾倫,雅芳,布蘭德,卡萬,Clauge那麼我的查詢應按照以下順序返回這些:PGSQL通過每個用戶名中的特定字母來查詢排序

  • 檸檬
  • Loger
  • 艾倫
  • 布蘭德
  • Clauge
  • 雅芳
  • 卡萬

即「L」的信應該在分揀

沙发
0
1

可以使用position函數來提取的l的位置,並且排序根據該優先級是。有,但是,兩個警告要牢記:

  1. position是大小寫敏感的,所以你必須與案件明確地處理(例如,通過lowercasing字符串進行搜索)。
  2. 如果你要搜索的字符串(l,在這種情況下)是不是在字符串中,position將返回0,所以你必須處理0明確,以免不LS的名字排在前面,而不是最後的:


SELECT name 
FROM  mytable 
ORDER BY CASE POSITION('l' IN LOWER(name)) 
       WHEN 0 THEN NULL 
       ELSE POSITION('l' IN LOWER(name)) 
     END ASC NULLS LAST, 
     name 
+1

確定這是一個很酷的解決方案:o –

+0

感謝@mureinik。提供的查詢適用於我。 :) –

0
votes
answers
60 views
+10

在PostgreSQL的where子句中使用XML列

1

我想支持某些DB的hibernate中包含XML內容的列的where子句。我通過擴展org.hibernate.dialect.OraclexDialect類並通過registerFunction方法註冊xml函數來實現Oracle。生成的查詢的示例:在PostgreSQL的where子句中使用XML列

SELECT * 
FROM OM_PERSON this_ 
WHERE xmltype.createxml(this_.config_xml).existsNode('/*[condition/text()="19943"]')=1; 

其在hibernate註冊(對於Oracle)函數:

xmltype.createxml(?1).existsNode(?2) 

現在我想支持PostgreSQL(優選版本:9.6)過了,我找不到任何等效的功能。所以我的問題是在PostgreSQL上面的查詢Oracle有沒有等價的函數/語句?

沙发
0
1

PostgreSQL有一個功能XMLEXISTS,所以你的查詢可以是這樣的:

SELECT * 
    FROM OM_PERSON x 
    WHERE XMLEXISTS('/*[condition/text()="19943"]' PASSING x.config_xml) 

我沒有想法,如何能在Hibernate中使用。

0
votes
answers
67 views
+10

彈簧數據jpa和多個集合的條件

3

我想通過一個所有應該匹配的列表。彈簧數據jpa和多個集合的條件

@Query("select g.name as name FROM Gym g " + 
      "LEFT JOIN g.listOfEquipment listOfEquipment " + 
      "WHERE " + 
      "(((:listOfEquipment) is null) or listOfEquipment.id in (:listOfEquipment)) "+ 
      "AND (((:listOfAmenity) is null) or listOfAmenity.id in (:listOfAmenity))") 
    Page<Map<String, Object>> listing(@Param("listOfEquipment") Set<Integer> listOfEquipment,@Param("listOfAmenity") Set<Integer> listOfAmenity) 

上述查詢OR工作,但我需要AND

假如我是路過1,2,3 那麼結果應該是所有gym誰擁有設備1 and 2 and 3 同爲舒適性也

我試圖 Finding items with a set containing all elements of a given set with jpql

但它沒有幫助荷蘭國際集團我監守有多個過濾器

網址是

http://localhost:8080/filter?listOfEquipment=5,3&listOfAmenity=51,13&sort=name 
+3

「不工作」。我想知道這意味着什麼。也許通過查看調用的SQL,你會發現更多?此處沒有人看到實體類可能會丟失什麼 – DN1

沙发
0
2

該查詢應該給你Gym.id與假設列表不包含重複項的所有listOfEquipment相匹配。

select g.id as name 
FROM Gym g 
LEFT JOIN g.listOfEquipment listOfEquipment 
WHERE listOfEquipment.id in (:listOfEquipment)) 
GROUP BY g.id 
HAVING count(g.id) = #{#listOfEquipment.size}  

你可以用它在你的主查詢爲listOfAmenity類似查詢的子查詢。

select g.name as name 
FROM Gym g 
LEFT JOIN g.listOfEquipment listOfEquipment 
WHERE (((:listOfEquipment) is null) 
    OR g.id in (
    select g.id as name 
    FROM Gym g 
    LEFT JOIN g.listOfEquipment listOfEquipment 
    WHERE listOfEquipment.id in (:listOfEquipment)) 
    GROUP BY g.id 
    HAVING count(g.id) = #{#listOfEquipment.size} 
)) 
AND (((:listOfAmenity) is null) 
    OR g.id in (
    select g.id as name 
    FROM Gym g 
    LEFT JOIN g.listOfAmenity listOfAmenity 
    WHERE listOfAmenity.id in (:listOfAmenity)) 
    GROUP BY g.id 
    HAVING count(g.id) = #{#listOfAmenity.size} 
)) 
板凳
0
1

沒有在最後的,條件 缺少的支架應該是如下

@Query("select g.name as name FROM Gym g " + 
     "LEFT JOIN g.listOfEquipment listOfEquipment " + 
     "WHERE " + 
     "(((:listOfEquipment) is null) or listOfEquipment.id in  (:listOfEquipment)) "+ 
     "AND (((:listOfAmenity) is null) or listOfAmenity.id in (:listOfAmenity))") 
+0

,因爲這不是我原來的查詢。 但它不能解決我的問題。 ,因爲我不想'或'條件我需要'和'條件 –