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 Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 14

0
votes
answers
5 views
+10

SQL:在更新

0

我不能發現我的請求,問題誤差內加盟。這裏是我的要求和2臺:SQL:在更新

UPDATE RESERVATION inner join client on reservation.numcl = client.numcl 
SET reservation.numcl2 = client.numcl2; 

錯誤:

=> [42000][971] ORA-00971: missing SET keyword 
  1. 表客戶 Client table

  2. 預訂客戶 reservation table

解決辦法:

UPDATE RESERVATION SET reservation.numcl2 = (select client.NUMCL2 
              from CLIENT 
              where client.NUMCL= RESERVATION.numcl); 
+0

你是在第一行之後突出顯示第一行還是錯過了';'? – Hans

+0

我並沒有真正明白你的意思,突出顯示了第一行,但內部連接在選擇實例中工作得很好。而且;應該在最後的權利? – Rotciv

+0

我認爲它不允許你「更新」一個連接。它正在尋找表名後面的'SET'關鍵字,當它執行一個簡單的'UPDATE'時,它通常會出現...... –

沙发
0
0

Oracle不支持在updatejoin(至少明確地)。你想要做什麼的等效是:

UPDATE RESERVATION r 
    SET numcl2 = (select client.NUMCL2 
        from CLIENT c 
        where c.NUMCL = r.numcl 
       ) 
    WHERE EXISTS (SELECT 1 FROM client c WHERE c.NUMCL = r.numcl); 

exists是很重要的,如果你想處理在沒有比賽的案件。

+0

好吧,我明白了!但在我的情況下,他們不能在預留數量不在客戶端,所以我不需要把它放在正確的?在存在選擇之後,'1'的用法是什麼? – Rotciv

+0

@Rotciv。 。 。如果你不需要檢查比賽,那麼你不需要。我只是指出Oracle中等效的語法。 「選擇」後面的內容並不重要; 「1」很容易打字。 –

0
votes
answers
5 views
+10

「TypeError:只能加入一個迭代」當試圖將列表項添加到字符串

2

我有一個類有兩個列表作爲變量。它有一個對象,它應該將列表中的每個元素添加到(相當長的)字符串中,然後返回到主程序,最終通過打印。我用for循環遍歷列表並使用.join()將每個對象添加到字符串,但我得到一個TypeError:「只能加入一個迭代」。「TypeError:只能加入一個迭代」當試圖將列表項添加到字符串

列表包含在餐廳購買的東西的價格,所以只是浮動數字。

Class A: 

    def __init__(self, etc.): 
     self.__foods = [] 
     self.__drinks = [] 

然後我有一個對象,它應該打印一張預先確定的收據,然後作爲一個字符串傳遞給主程序。

Class A: 
    ... 

    def create_receipt(self): 
     food_price_string = "" # What is eventually joined to the main string 
     food_prices = self.__foods # What is iterated 

     for price in food_prices: 
      food_price_string.join(price) # TypeError here 
      food_price_string.join("
") # For the eventual print 

這裏就是我得到的類型錯誤 - 該程序拒絕加入「價格」變量上面創建的字符串。我應該做同樣的事情的飲料價格也一樣,兩者將被加入到字符串的其餘部分:

沙发
0
4

有兩個問題在這裏:

  1. str.join不會改變字符串(字符串是不可變的),它返回一個新的字符串;和
  2. 它需要輸入一個可迭代的連接在一起的字符串,而不是將單個字符串加在一起。

事實上,food_prices是迭代不要緊,因爲你使用for循環中,price s爲的food_prices的元素,這樣的話你加入列表的一個項目。

可以改寫程序,如:

def create_receipt(self): 
    food_prices = self.__foods 
    food_price_string = '
'.join(str(price) for price in food_prices) food_price_string += '
' # (optional) add a new line at the end 
    # ... continue processing food_price_string (or return it)
+0

注:即使一個字符串項是Python中的序列(迭代器)。如果列表項是字符串,則不會有TypeError(儘管問題中的「」.join「用法仍然是錯誤的)。要打印食品價格,每行一個:'print(* food_prices,sep =' n')'。手動格式化:'s =' n'.join(map(str,food_prices))+' n'' – jfs

0
votes
answers
5 views
+10

如何在Ionic 3中執行多個異步操作並在完成所有操作後關閉加載程序?

1

我開發了一個Ionic 3應用程序,它可以根據需要緩存文章內容列表。我正在使用Storage,它使用承諾進行操作。如何在Ionic 3中執行多個異步操作並在完成所有操作後關閉加載程序?

我的代碼如下:

物品service.ts

getArticleFullData(articleId: number) { 
    let appSettings = this.appSettingsService.getSettings(); 
    let params = this.utilsService.serializeQueryParams(appSettings); 
    let url = `${this.apiBasePath}Article/GetArticleFullData?articleId=${articleId}&${params}`; 
    this.loggingService.logInfo("Getting article full data from url " + url); 
    return this.http.get(url) 
     .map(res => res.json()); 
} 

文章-緩存service.ts

// saves a single article to the cache 
private saveToCache(articleId: number): Observable<any> { 

    let key = articleId; 
    let obs = this.articleService.getArticleFullData(key); 
    obs.subscribe(data => { 
     this.storage.set(this.GetArticleFullKey(key), data as ArticleFullData); 
    }, 
     err => { 
      this.loggingService.logError("Failed to cache data for article: " + key); 
     } 
    ); 

    return obs; 
} 

// tries to cache a list of article in the cache 
// avoids overwriting the data, if exists 
public saveArticleDataToCache(articles: ArticleBriefData[]): Observable<{}[]> { 

    var obsArray = []; 
    for (let article of articles) { 
     let key = this.GetArticleFullKey(article.ArticleId); 
     this.storage.get(key) 
      .then(data => { 
       console.log("Storage data for article " + key, data); 

       if (!data) { 
        obsArray.push(this.saveToCache(article.ArticleId)); 
       } 
      }) 
      .catch(err => { 
       this.loggingService.logError("Failed to check storage for key " + key, err); 
      }); 
    } 

    var ret = Observable.forkJoin(obsArray); 
    return ret; 
} 

包含代碼裝載機

this.loadingCtrl.create({ content: "Caching data. Please wait..." }); 
    this.loadingCtrl.present(); 

    var all = this.articleCacheService.saveArticleDataToCache(this.articles); 
    var subscr = all 
     .toPromise() 
     .then(data => { 
      console.log("All data: ", data); 
      this.loadingCtrl.dismiss(); 
      this.loggingService.logInfo("Successfully cached articles "); 
     }) 
     .catch(err => { 
      this.loadingCtrl.dismiss(); 
      this.loggingService.logError("Failed to cache data: ", JSON.stringify(err)); 
     } 
    ); 

緩存過程正確執行,但then代碼,立即執行(dataundefined

我也曾嘗試subscribe的方法,但內subscribe代碼似乎並沒有被執行(緩存爲正確執行,雖然):

var all = this.articleCacheService.saveArticleDataToCache(this.articles); 
    var subscr = all 
     .subscribe(data => { 
      console.log("All data: ", data); 

      this.loadingCtrl.dismiss(); 
      this.loggingService.logInfo("Successfully cached articles "); 
     }, 
     err => { 
      this.loadingCtrl.dismiss(); 
      this.loggingService.logError("Failed to cache data: ", JSON.stringify(err)); 
     } 
    ); 

我顯然無法與Observable工作在這兒。

問題:如何在Ionic 3中執行多個異步操作並在完成所有操作後關閉加載程序?

沙发
0
1

您可以使用forkjoin輕鬆做到這一點。

注:我已經提取的代碼從我case.If你使用RXJS 5.5.2然後根據最新changes here

import { Observable } from "rxjs/Observable"; 
import 'rxjs/add/observable/forkJoin' 

let myTopicApi = this.getMytopic(); 
let myarticlApi = this.getMyArticles(); 
let myPicksAPi = this.getMyPicks(); 
Observable.forkJoin([myTopicApi, myarticlApi, myPicksAPi]) 
    .subscribe(res => { 
    this.arrangeMytopics(res[0]); 
    this.arrangeMyArticles(res[1]); 
    this.arrangeMyPicks(res[2]); 
    if (loading) { loading.dismiss(); loading = null; }//here you can dismiss your loader 
    }, 
    error => { if (loading) { loading.dismiss(); loading = null; }//here you can dismiss your loader }, 
() => { }); 

getMytopic() { 
    return this.topicSer.getMyTopics().map((res: any) => res.json()).map((res: any) => res = res.categories) 
     .catch((err: any) => { }) 
    } 
+0

感謝您的快速答覆。我正在使用'rxjs 5.4.0'。我的代碼已經使用'forkJoin',但它不能按預期工作。它可能與'getArticleFullData'的作用有關,但我無法弄清楚什麼是錯誤的(我也添加了該函數的代碼)。 – Alexei

+0

試着'let'而不是'var'來看看。 – Sampath

+0

也似乎你沒有正確使用'forkjoin'。我已更新我的帖子。希望你能更好地瞭解如何使用'forkjoin'。 – Sampath

板凳
0
1

Sampath改變imports根據您的使用app.So改變它「我的回答幫助我找到了問題。我做錯的是我構建Observable陣列的方式(即它在forkJoin中使用):推送then函數中的Promise函數返回的存儲get。固定在此之後

我的代碼且還包括支票項存在(以避免HTTP呼叫和重置存儲的數據):

物品service.ts

getArticleFullData(articleId: number) { 
    let appSettings = this.appSettingsService.getSettings(); 
    let params = this.utilsService.serializeQueryParams(appSettings); 
    let url = `${this.apiBasePath}Article/GetArticleFullData?articleId=${articleId}&${params}`; 
    return this.http.get(url) 
     .map(res => res.json()); 
} 

文章緩存-service.ts

我正在使用flatMap來鏈Observable從檢查存儲是否已經有密鑰獲得並且實際獲取。如果數據存在,我會返回一個空的Observable以實際取消該過程。

private saveToCache(articleId: number): Observable<any> { 

    let key = this.GetArticleFullKey(articleId); 

    let storageObs = Observable.fromPromise(this.storage.get(key)); 
    let getArticleObs = this.articleService.getArticleFullData(articleId); 

    let obs = storageObs.flatMap(data => { 
     if (!data) 
      return getArticleObs; 
     else 
      return Observable.of(null); 
    }); 

    obs.subscribe(data => { 

     if (data) 
      this.storage.set(key, data as ArticleFullData); 
    }, 
     err => { 
      this.loggingService.logError("Failed to cache data for article: " + articleId); 
     } 
    ); 

    return obs; 
} 

public saveArticleDataToCache(articles: ArticleBriefData[]): Observable<{}[]> { 

    let obsArray = []; 
    for (let article of articles) { 

     let obs = this.saveToCache(article.ArticleId); 
     obsArray.push(obs); 
    } 

    let ret = Observable.forkJoin(obsArray); 
    return ret; 
} 

實際認購

onCacheRefresh() { 
    // articles are not loaded for some reason 
    if (!this.articles) 
     return; 

    this.loadingCtrl.create({ content: "Caching data. Please wait..." }); 
    this.loadingCtrl.present(); 

    let all = this.articleCacheService.saveArticleDataToCache(this.articles); 
    let subscr = all 
     .subscribe(data => { 
      console.log("All data: ", data); 

      this.loadingCtrl.dismiss(); 
      this.loggingService.logInfo("Successfully cached articles "); 
     }, 
     err => { 
      this.loadingCtrl.dismiss(); 
      this.loggingService.logError("Failed to cache data: ", JSON.stringify(err)); 
     } 
    ); 
} 
0
votes
answers
5 views
+10

加入到活動記錄codeigniter

-2

您想幫助我嗎?如何將這個sql查詢更改爲活動記錄在笨加入到活動記錄codeigniter

LEFT JOIN MGMETADATA.services d ON d.protocol = e.protocol and d.port = e.s_port 

感謝,

+2

它是你的完整查詢嗎? –

沙发
0
0

請儘量將

$this->db->select('*'); 
$this->db->from('tableE'); 
$this->db->join('tableD','tableD.protocol=tableE.protocol and tableD.port=tableE.s_port','left'); 
$query = $this->db->get(); 
return $query->result(); 

我希望這可以幫助你

板凳
0
0
$this->db->select("*") 
     ->join("MGMETADATA.services as d","d.protocol = e.protocol","left") 
     ->where("d.port = e.s_port") 
     ->get("tablename e") 
     ->result(); //for json format 

注:不要使用「*」選擇所有列,請使用單個列名進行檢索。

0
votes
answers
5 views
+10

如何加入不同的表格?

0

我試着搜索相關的查詢語句並應用但不工作。如何加入不同的表格?

我想在一個GET調用中加入我所有的api表,並且我無法執行它。查詢失敗並獲取錯誤。

我的查詢看起來像這樣的表我已經顯示。

SELECT projects.*, images.*, rewards.*, shipping.* 
FROM projects 
LEFT JOIN rewards ON rewards.projects_id = projects.id 
LEFT INNER JOIN rewards ON rewards.id = shipping.reward_id 
LEFT JOIN images ON projects.id = images.project_id 
WHERE projects.id = 1 

enter image description here

我想加入的獎勵和運輸與所有的表,項目回報有一個關係到許多和獎勵航運也一對多。我怎麼能結合在一個查詢中的所有這一切?我也嘗試子查詢,但我不知道如何使這些表中的查詢。 請解釋一下如何在子查詢或聯接中工作? 如果不是很好的做法,請說明我的其他技術。

UPDATE

我試圖像這樣使用子查詢它說未知列運送

SELECT projects.*, rewards.*, images.image, shipping = (SELECT * 
FROM shipping 
WHERE shipping.reward_id IN (SELECT * FROM rewards WHERE rewards.project_id = 1)) 
FROM projects JOIN rewards ON rewards.project_id = projects.id 
LEFT JOIN images ON projects.id = images.project_id 
WHERE projects.id = 1 
+1

你在哪裏找到這個'LEFT INNER JOIN'? 請爲你的桌子分享'show create table'並且你想要得到的最終結果 – AnouarZ

+1

如果你要從這四張桌子中選擇所有的數據,你將不知道哪個圖像與哪個獎勵結合在一起,所以結果將會因爲每個圖像都會與每一個獎勵結合在一起。您應該提供樣本數據和您想要的樣本數據的輸出。 – trincot

+0

嗨。請合理地格式化該代碼。另請閱讀並在[mcve]上採取行動。並閱讀關係數據庫的介紹 - 你的問題只是要求一個。同樣谷歌SO爲您的標題/問題的變化的例子。 – philipxy

沙发
0
1

您的查詢有幾個語法問題。要加入的所有表格中,你可以這樣寫:

SELECT projects.title, rewards.price, images.images, shipping.shipping 
FROM  projects 
LEFT JOIN images ON images.project_id = projects.id 
LEFT JOIN rewards ON rewards.project_id = projects.id 
LEFT JOIN shipping ON shipping.rewards_id = rewards.id 
WHERE  projects.id = 1 

,但請注意,如果你有許多圖像和許多獎勵爲同一個項目,這個查詢會產生圖像和獎勵的所有組合,因爲您的數據庫模式不會定義哪個圖像屬於哪個獎勵。

+0

謝謝,它的工作。那就是示例表和查詢。它也適用於我真正的查詢。但表格數據重複,因爲我有1:m的關係。你能建議我如何過濾?如果不是,我會在PHP中做到這一點。 –

+0

如果您要求獲得'null'值而不是重複值,那麼是的,您應該在PHP中執行此操作。儘管可以在SQL中完成,但它不是SQL的角色,並且會使查詢變得相當複雜,並且輸出難以訂購。用PHP做。 – trincot

0
votes
answers
5 views
+10

如何獲取登錄用戶不是MySQL中的所有用戶?

3

我完全能夠得到所有的登錄用戶當前的朋友,這是我此查詢這裏做 -如何獲取登錄用戶不是MySQL中的所有用戶?

SELECT users.* 
FROM users 
LEFT JOIN friends 
ON users.id = friends.friend_id 
WHERE friends.user_id = $user_logged_in_id 

但我想要做的相反,我也搞不清楚。

我想要做朋友的邏輯。

我需要得到所有誰是當前登錄用戶的用戶尚未朋友

我有一個用戶表和朋友表作爲一個多用戶和他們的朋友之間一對多的關係。 friends表中的鍵是user_id friend_id。

爲了說明某人是我與其他用戶的朋友(說登錄的用戶ID是3,朋友的用戶ID是6)user_id = 3friend_id = 6作爲一行,然後把另一行與ID的翻轉來說明友誼的另一種方式,user_id = 6friend_id = 3

用戶表

|---------------------|------------------| 
|   id   |  username  | 
|---------------------|------------------| 
|   1   |  sonja12  | 
|---------------------|------------------| 
|   2   |  dorris32  | 
|---------------------|------------------| 
|   3   |  billy32  | 
|---------------------|------------------| 
|   4   |  micha97  | 
|---------------------|------------------| 
|   5   |  travis841 | 
|---------------------|------------------| 
|   6   |  johnny28  | 
|---------------------|------------------| 

朋友表

|---------------------|------------------|------------------| 
|   id   |  user_id  |  friend_id | 
|---------------------|------------------|------------------| 
|   1   |  3   |   6  | 
|---------------------|------------------|------------------| 
|   2   |  6   |   3  | 
|---------------------|------------------|------------------| 

編輯:

我想我已經縮小我的問題有點更簡潔。

我想從用戶表中獲取所有用戶,其中他們的ID不會顯示爲朋友表中當前登錄用戶的user_id旁邊的朋友ID。

+1

更具體。現在看起來像'... WHERE friends.user_id!= $ user_logged_in_id「'會修復它,但我假設,這沒有奏效? – SourceOverflow

+0

不,返回除登錄用戶以外的所有人,並且它返回用戶登錄的用戶已經是朋友的兩倍 我希望能夠看到登錄用戶不是朋友的列表,以便他們可以輕鬆點擊「添加朋友按鈕」並添加新朋友。返回所有用戶並排除那些已經登錄的用戶已經是朋友,但我覺得像普通的sql會是一個更好的方式去這樣的事情。 –

沙发
0
2

您以奇怪的方式思考問題。這可能有助於將其視爲需要創建的集合的交集,而不是缺少id的集合。

SELECT id from users WHERE id != $logged_in_user AND id NOT IN (SELECT friend_id from friends where user_id=$logged_in_user)

+1

小心:'NOT IN(SELECT ...)'是非常可怕的在MySQL中緩慢 –

+0

@RickJames你知道比'NOT IN'更好的方式來完成任務嗎?我肯定對它開放。我現在看到其他答案,但不確定它們中的任何一個是否會我想我可以測試他們所有的並記錄執行時間。我的替代方案更慢,因爲我之前返回了整個列表,然後在每個用戶的循環中運行另一個單獨的查詢,以將它們從php中的數組中刪除,如果它們已經是朋友8 –

+1

'NOT EXISTS(SELECT 1 ... )' - 只評估直到它得到答案,而不是建立整個列表。或者'LEFT JOIN ... ON ... WHERE .. IS NULL' - 有時候類似的代碼。複合INDEX(user_id,friend_id)'會有很大的幫助。 –

板凳
0
0

SQL

SELECT u.* 
FROM usrs u 
LEFT JOIN friends f 
ON u.id = f.friend_id 
GROUP BY u.id, u.username, IF(f.user_id = $user_logged_in_id, 1, 0) 
HAVING MAX(IF(f.user_id = $user_logged_in_id, 1, 0)) = 0; 

演示

http://rextester.com/ELXFZ39682

說明

該查詢是基於您的原始數據,但是按每個用戶ID進行分組,因此不會返回重複項。爲了返回那些不是登錄用戶的好友,IF(f.user_id = $user_logged_in_id, 1, 0)將生成的列添加到設置爲1的組,如果該行是登錄用戶的好友,否則爲0.然後,我們可以使用HAVING MAX(...) = 0限制爲沒有行是朋友的組。

地板
0
1

對於更大的數據集,我會用一個NOT EXISTS子查詢的查詢:

select u.* 
from users u 
where u.id <> $user_logged_in_id 
    and not exists (
    select * 
    from friends f 
    where f.user_id = $user_logged_in_id 
     and f.friend_id = u.id 
) 

或LEFT(反)JOIN:

select u.* 
from users u 
left join friends f 
    on f.user_id = $user_logged_in_id 
    and f.friend_id = u.id 
where u.id <> $user_logged_in_id 
    and f.friend_id is null 

我認爲這兩個查詢執行計劃應該是差不多的相同。

演示:http://rextester.com/KUOZ9198

4楼
0
0
SELECT DISTINCT users.id, users.username 
    FROM users 
     LEFT OUTER JOIN friends 
    ON (friends.user_id = $user_logged_in_id and friends.friend_id = users.id) 
WHERE users.id <> $user_logged_in_id 
    AND friends.friend_id is null; 

該查詢可能會比NOT IN子查詢,如果用戶預計將有很多的朋友更好的性能。如果不是在子查詢執行相同,如果不是更好。

請注意DISTINCT。你需要這個,因爲這種關係是多對多的。

0
votes
answers
4 views
+10

如何停止在pthread_join上停滯的線程?

0

我有一個項目,我正在將作業添加到隊列中,並且我有多個線程正在進行作業,並計算出自己的獨立結果。如何停止在pthread_join上停滯的線程?

我的程序處理SIGINT信號,我試圖加入線程來合併結果,打印到屏幕,然後退出。我的問題是,當我發送信號時線程似乎停止工作,或者他們在mutex_lock上被阻塞。這裏是我的程序的重要部分,以便簡潔。

的main.c

//the thread pool has a queue of jobs inside 
//called jobs (which is a struct) 
struct thread_pool * pool; 

void signal_handler(int signo) { 
    pool->jobs->running = 0; //stop the thread pool 
    pthread_cond_broadcast(pool->jobs->cond); 

    for (i = 0; i < tpool->thread_count; i++) { 
     pthread_join(tpool->threads[i], retval); 
     //do stuff with retval 
    } 

    //print results then exit 
    exit(EXIT_SUCCESS); 
} 

int main() { 
    signal(SIGINT, signal_handler); 
    //set up threadpool and jobpool 
    //start threads (they all run the workerThread function) 
    while (1) { 
     //send jobs to the job pool 
    } 
    return 0; 
} 

thread_stuff.c

void add_job(struct jobs * j) { 
    if (j->running) { 
     pthread_mutex_lock(j->mutex); 
     //add job to queue and update count and empty 
     pthread_cond_signal(j->cond); 
     pthread_mutex_unlock(j->mutex); 
    } 
} 

struct job * get_job(struct jobs * j) { 

    pthread_mutex_lock(j->mutex); 

    while (j->running && j->empty) 
     pthread_cond_wait(j->cond, j->mutex); 

    if (!j->running || j->empty) return NULL; 

    //get the next job from the queue 
    //unlock mutex and send a signal to other threads 
    //waiting on the condition 
    pthread_cond_signal(j->cond); 
    pthread_mutex_unlock(j->mutex); 
    //return new job 
} 

void * workerThread(void * arg) { 
    struct jobs * j = (struct jobs *) arg; 
    int results = 0; 
    while (j->running) { 
     //get next job and process results 
    } 
    return results; 
} 

感謝您的幫助,這是給我一個真正的頭痛!

+0

如果您閱讀[此POSIX信號概念參考](http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04),您將在2.4.3節的末尾看到一個列表的* async-safe *函數,因此可以從信號處理程序安全地使用。如果您查看該列表,您會看到['pthread_join](http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html)*未列出。這意味着你不應該在信號處理程序中調用它。 –

沙发
0
2

您不應該從處理異步生成信號的信號處理程序(如SIGINT)中調用pthread_cond_waitpthread_join。相反,你應該爲所有線程屏蔽SIGINT,產生一個專用線程,並在那裏調用sigwait。這意味着您在信號處理程序環境之外檢測到SIGINT信號的到達,因此您不受限於async-signal-safe functions。如果信號傳遞給其中一個工作線程,您還可以避免自我死鎖的風險。

此時,您只需要按順序關閉工作隊列/線程池。根據具體情況,您現有的使用running標誌的方法甚至可能不會改變。

+0

真棒謝謝!我也有一個問題,那麼當我退出get_job函數由於關機,我沒有解鎖互斥體:')那麼pthread_join不是一個異步信號安全函數的原因是什麼? – ImpendingShroom

+0

很少有功能是異步信號安全的。 'pthread_join'需要釋放資源,操作堆的函數永遠不會異步信號安全,因爲POSIX不需要一個異步信號安全的內存分配器。 –

+0

有道理,謝謝你的幫助! – ImpendingShroom

0
votes
answers
4 views
+10

SQL左連接:如何從tableB返回最新並由另一個字段分組

0

我一直在嘗試兩天,沒有運氣。SQL左連接:如何從tableB返回最新並由另一個字段分組

我有我的數據庫中以下簡化表:

客戶:

| id | name  | 
| 1 | andrea | 
| 2 | marco | 
| 3 | giovanni | 

訪問:

| id | name_id | date | 
| 1 | 1  | 5000 | 
| 2 | 1  | 4000 | 
| 3 | 2  | 1500 | 
| 4 | 2  | 3000 | 
| 5 | 2  | 1000 | 
| 6 | 3  | 6000 | 
| 7 | 3  | 2000 | 

我想所有的名字與他們的最後訪問日期返回。

起初我

SELECT * FROM customers LEFT JOIN access ON customers.id = 
access.name_id 

只是嘗試,但我得到了7行,而不是3預期。所以I understood I need to use GROUP BY statemet如下所示:

SELECT * FROM customers LEFT JOIN access ON customers.id = 
access.name_id GROUP BY customers.id 

據我所知,GROUP BY使用隨機行聯合收割機。事實上,我有幾個測試無序的訪問日期。

相反,我需要將每個客戶ID與其對應的最新訪問進行分組!如何做到這一點?

+0

我不確定我是否正確理解您希望在這裏實現的目標,但我留下的印象可能會誤解LEFT JOIN的工作原理。如果您擁有像MAX或MIN這樣的聚合功能,則GROUP BY將起作用。你能更好地解釋你期望看到的輸出是什麼? – Stefano

+0

@decadenza。 。 。 「SELECT *」與「GROUP BY」的使用是一個破碎的問題,它已經在最新版本的MySQL中得到了很好的解決。這不是做你想做的事的正確方法。 –

沙发
0
1

您必須從訪問表中獲取最近的日期,並在name_id上??使用group by,然後將此結果與客戶表。以下是查詢:

select c.id, c.name, a.last_access_date from customers c left join 
(select id, name_id, max(access_date) last_access_date from access group by name_id) a 
on c.id=a.name_id; 

這是在sqlfiddle上的DEMO。如果這個說法是正確的

SELECT a.*, c.* 
FROM customers c LEFT JOIN 
    access a 
    ON c.id = a.name_id AND 
     a.DATE = (SELECT MAX(a2.date) FROM access a2 WHERE a2.name_id = a.name_id); 

板凳
0
1

我認爲這是你想達到什麼樣的:

SELECT c.id, c.name, max(a.date) last_access 
FROM customers c 
LEFT JOIN access a ON c.id = a.name_id 
GROUP BY c.id, c.name 

的LEFT JOIN將返回表客戶的所有條目無論是否連接標準(c.id = a.name_id)滿意。這意味着你可能會得到一些NULL條目。

例子:

只需在客戶表中添加一個新行(ID:4,名稱:曼努埃拉)。輸出將有4行,最新的行將是(id:4,last_access:null)

地板
0
1

我的ON子句中使用相關子查詢做到這一點

我需要組每一位客戶ID與其對應的最新的訪問!如何做到這一點?

然後,你可以簡單地做:

??

你不需要customers表,因爲:

  • 所有的客戶都在access,所以left join是沒有必要的。
  • 您不需要customers的列。
0
votes
answers
3 views
+10

MySQLIntegrityConstraintViolationException:重複錄入例外@JoinTable休眠

0

當我試圖使用Hibernate保存一個實體,它給MySQLIntegrityConstraintViolationException: Duplicate entry '2' for key ...MySQLIntegrityConstraintViolationException:重複錄入例外@JoinTable休眠

這是關聯類首

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "selectedLanguages", 
joinColumns = @JoinColumn(name = "preferenceId"), 
inverseJoinColumns = @JoinColumn(name = "languageId")) 
private List<Language> languages; 

聲明,這是在mysql服務器中創建表

CREATE TABLE `languages` (
    `preferenceId` bigint(20) NOT NULL, 
    `languageId` int(11) NOT NULL, 
    UNIQUE KEY `UK_ipl1uqtuxu2oxu5pddfi6sebl` (`languageId`), 
    KEY `FKm18lbdrrxs89ff7pymjalc7ca` (`preferenceId`), 
    CONSTRAINT `FKhmgypuduucfqf98sf2ymorqpr` FOREIGN KEY (`languageId`) REFERENCES `languages` (`languageId`), 
    CONSTRAINT `FKm18lbdrrxs89ff7pymjalc7ca` FOREIGN KEY (`preferenceId`) REFERENCES `preferences` (`preferenceId`) 
); 

它顯示語言ID是唯一的,這不是作爲用戶的預期行爲可以知道一些語言和一種語言可以被許多用戶引用, 我試圖在inverseJoin部分中添加unique=false而沒有成功。 如何刪除languageId的唯一約束。我的代碼有什麼問題?任何幫助將不勝感激。請問你是否需要更多的數據信息

沙发
0
0

它工作時,我改變List<Language>Set<Language>不知道爲什麼。 **如果有人知道原因,請張貼。

0
votes
answers
3 views
+10

SQL-如何連接表和那些空值,特別是使用連接表中的一個項目?

1

請檢查以下表格:SQL-如何連接表和那些空值,特別是使用連接表中的一個項目?

當表1左列表項2連接到表項2時,對於梨和橙色,Coef列將爲空。我怎樣才能讓表格2中的ItemName = 其他匹配所有非映射項目?

目前,我正在使用臨時表來過濾那些空的項目,把正確的COEF,然後聯盟與映射項結果得到最終的表3

有沒有更好的方式來實現這一目標?

表1:

ItemName | Cost | 
Apple  | 1  | 
Banana | 2  | 
Pear  | 3  | 
Orange | 4  | 

表2:

ItemName | Coef | 
Apple  | 0.1 | 
Banana | 0.2 | 
Others | 0.8 | 

預期結果:

ItemName | Cost | Coef | 
Apple  | 1  | 0.1 | 
Banana | 2  | 0.2 | 
Pear  | 3  | 0.8 | 
Orange | 4  | 0.8 | 
+0

的數據庫是你真正使用中,MySQL或SQL Server?請標記corectly –

沙发
0
3

你可以cross join與單列你的結果和採取的第一個非空價值:

SELECT  t1.itemname, t1.cost, COALESCE(t2.coef, def.coef) 
FROM  t1 
LEFT JOIN t2 ON t1.itemname = t2.itemname 
CROSS JOIN (SELECT coef 
      FROM t2 
      WHERE itemname = 'Others') def 
+0

次要拼寫:'itername' =>'itemname' – tonypdmtr

+0

@tonypdmtr編輯和固定 - 感謝注意到 – Mureinik

+0

偉大的作品! Thx – Spencer

板凳
0
3

您可以使用兩個左聯接:

select t1.*, 
     coalesce(t2.coef, t2o.coef) as coef 
from t1 left join 
    t2 
    on t1.itemname = t2.itemname left join 
    t2 t2o 
    on t2o.itemname = 'Others'; 
+0

小拼字:''others'' =>''其他' – tonypdmtr

+0

很棒!謝謝 – Spencer