2016-04-12 54 views
0

我正在使用一個很好的php框架來處理我的數據庫medoo.php。鏈接medoo文檔以供參考:http://medoo.in/docMysql獲取所有連接記錄這兩個表

我想要的東西發生:

  • 返回連接表,它的一個或多個條件從右表匹配的所有記錄。 (主表爲'項目')
  • 包含右表中的匹配/連接記錄。 (在這種情況下,所有'標籤'與'物品'相關)。

什麼是目前發生的事情:左表(項目)

  • 返回記錄加入了與右表(標籤)。但是,它僅從WHERE條件返回顯式包含標記的記錄。我希望所有標籤都加入到這些商品中,這些商品的標籤符合WHERE條件。

讓我們一些代碼來更好地說明這個問題:

//example 'items' table 
    id - 123 
    name - 'test' 
    desc - 'testing' 

//example 'tags' table 
    id - 100 
    name - 'tag1' 

//example 'taglist' table (relational) 
    id  - 10 
    itemid - 123 
    tagid - 100 

,說明了基本設置,最小有點爲清晰。

然後,使用medoo,我從'items'中選擇並加入標籤/ taglist以及左連接(當前)。 WHERE子句:tag.id匹配要發佈的tagid進行搜索。還嘗試在WHERE中的taglist.tagid。

返回的結果是包含與WHERE子句匹配的標記的所有'項',如您所期望的那樣。不過,我希望所有與這些項目一起使用的標籤,而不僅僅是我搜索的標籤(這是我得到的)。

我在想這一定與JOIN或WHERE子句有關,但是我必須說我經過數小時的嘗試,研究和更多的嘗試後纔會失去。希望有人能快速地給我一個答案,看看我可能在我的邏輯中犯了什麼錯誤。

有關進一步的參考,這裏是完整的查詢設置,使用medoo。

//setup query 
$table = 'items'; 
$join = [ 
    "[>]taglist(tl)" => ["id" => "itemid"], 
    "[>]filelist(fl)" => ["id" => "itemid"], 
    "[>]tags(t)" => ["tl.tagid" => "id"], 
    "[>]files(f)" => ["fl.fileid" => "id"] 
]; 
$cols = [ 
    "items.id(id)", 
    "items.itemid(itemid)", 
    "items.name(name)", 
    "items.def(def)", 
    "items.class(class)", 
    "items.timeline(timeline)", 
    "t.id(tagid)", 
    "t.name(tagname)", 
    "f.id(fileid)", 
    "f.name(filename)", 
    "f.path(filepath)", 
    "f.type(filetype)", 
    "tl.tagid" 
]; 
$where = [ 
    "AND" => ["tl.tagid" => $tags], 
    "ORDER" => ["items.id DESC","t.name ASC"], 
    "LIMIT" => [$start,$limit] 
]; 

// Do query 
$results = $db->select($table, $join, $cols, $where); 

如果你不熟悉medoo,這應該仍然說明如何設置查詢相當簡單。 (查詢工作正常,我只是沒有得到我想要的所有結果)。

謝謝你的任何建議。本週我正在學習很多東西!

回答

0

如果你做leftside LEFT JOIN rightside ON something然後做WHERE rightside.column = something你將左加入轉換成直接加入。

直接JOIN抑制leftside中與聯接中的ON不匹配的行。

所以試着擺脫你的WHERE條件。

編輯我不知道你提到的框架。

但是,要獲得每個具有特定tagid的項目,請執行此操作。

 SELECT DISTINCT itemid FROM taglist WHERE tagid = $tags 

然後,你可以做你的主查詢與

WHERE items.id IN (SELECT DISTINCT itemid FROM taglist WHERE tagid = $tags) 

過濾掉剛剛與匹配標籤的物品。您的主要查詢將獲取所有標籤,包括tagid = $tags以及所有其他標籤,但僅限於具有匹配標籤的商品。這一切都是集合論的核心。

+0

嗨Ollie,謝謝你的信息。它似乎與正在發生的事情保持一致。我有其他不同的條件和類似的設置腳本,我得到了預期的結果。在這種情況下,我需要找到解決方法,因爲這個腳本專門用於搜索標籤。 - 我不喜歡這個想法,但可能是2個獨立的查詢,第一個創建一個item ID數組,第二個選擇這些ID。 (這就解釋了爲什麼我的嘗試都沒有改變!噢,生活和學習:P) – turnfire