2016-02-24 134 views
0

多年來我已經完成了大量的SQL查詢與左連接,但從來沒有見過這一點,我無法找到它的任何信息。

讓與查詢開始

SELECT Services.rn AS srn, Address_Id, Customer_Id, Service_Id, Next_Service, Next_End, Confirmed, Address, First_Name, Last_Name, Company, Service_Type, City 
FROM `Services` 
LEFT JOIN 
    (SELECT rn, Address, City_Id FROM `Service_Address`) AS saddresss ON saddresss.rn = Services.Address_Id 
LEFT JOIN 
    (SELECT rn, First_Name, Last_Name, Company FROM `Customer`) AS customer ON customer.rn = Services.Customer_Id 
LEFT JOIN 
    (SELECT rn, Service_Type FROM `Service_Desc`) AS servdesc ON servdesc.rn = Services.Service_Id 
LEFT JOIN 
    (SELECT rn, City FROM `City_List`) AS city ON city.rn = saddresss.City_Id 
WHERE `Services`.`Next_Service` BETWEEN " . $daystart . " AND " . $dayend . " 
ORDER BY `Services`.`Customer_Id` ASC, `Services`.`Address_Id` ASC, `Services`.`rn` ASC 

唯一以上不包括爲$一天開始和$ dayend變量,他們只是UNIX時間戳。

通常然後我用一個while循環來處理結果

while ($row = $res->fetch_assoc()) 
{ 
    //do something here 
} 

但正如我得到空的輸出,我決定使用的var_dump調試。如果你var_dump「$ row」,你會得到一個數組,如果你使用了var_dump「$ res-> fetch_assoc()」,那麼這個數組也是一樣的。但不是這次,如果我var_dump「$ res-> fetch_assoc()」我得到的數組,但如果我var_dump「$行」我得到「bool(true)」爲每個「行」。如果試圖回顯「$ row」($ row ['City'])中的任何值,我什麼也得不到。

顯然結果是var_dump「$ res-> fetch_assoc()」顯示一個數組,它具有正確的數據,但我不知道如何獲取它,所以我可以顯示它。

編輯:

我忘了提,我跑在phpMyAdmin查詢,只有1456207200和$ dayend代$一天開始用1456293599,和它的作品。不知道爲什麼它不會在PHP

EDIT 2的工作:根據我對DRapp後的第二個評論

。我想也許「服務」表格結構會有所幫助。

CREATE TABLE IF NOT EXISTS `Services` (
    `rn` int(10) NOT NULL, 
    `Customer_Id` int(10) NOT NULL, 
    `Address_Id` int(10) NOT NULL, 
    `Service_With` int(10) NOT NULL, 
    `Service_Id` int(5) NOT NULL, 
    `Service_Desc` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL, 
    `Initial_Service` int(10) NOT NULL, 
    `Last_Service` int(10) NOT NULL, 
    `Next_Service` int(10) NOT NULL, 
    `Next_End` int(10) NOT NULL, 
    `Confirmed` int(1) NOT NULL, 
    `Product_Quantity` int(5) NOT NULL, 
    `Product_Rate` double(6,2) NOT NULL, 
    `Charge` double(6,2) NOT NULL, 
    `Fequency_Id` int(5) NOT NULL, 
    `Route` int(5) NOT NULL, 
    `Salesman` int(5) NOT NULL, 
    `Warranty_Expires` int(5) NOT NULL, 
    `Canceled` int(10) NOT NULL DEFAULT '0', 
    `Cancel_Reason` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL, 
    `Office_Note` text COLLATE utf8mb4_unicode_520_ci NOT NULL, 
    `Customer_Note` text COLLATE utf8mb4_unicode_520_ci NOT NULL, 
    `Technician_Note` text COLLATE utf8mb4_unicode_520_ci NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=4651 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; 
+0

很多次級選擇......我會看看錶格ID的內部連接...... – Codexer

+1

很顯然,where子句過濾掉所有行。我懷疑'Next_Service'不是一個unix時間戳。樣本數據和兩個變量的值將闡明發生了什麼。 –

+0

@Codexer我已經嘗試了內連接,並加入以查看是否會有一些差異。 – Krik

回答

0

讓我查詢到

SELECT * 
FROM Services 
WHERE Next_Service >= $daystart AND Next_Service <= $dayend 

然後在其主演的30分鐘,看看是否有任何缺陷後,我開始懷疑我的PHP作爲罪魁禍首。我在OP中提供的while循環是我用於處理查詢結果的默認while循環的一個示例。問題是,在這種情況下,我曾想過要快速避免一個額外的「if」聲明。我while循環實際上看起來像

while ($row = $res->fetch_assoc() && $somevalue != '') 
{ 
    //do something here 
} 

而且,如果你知道有關語法什麼,如果「$ someValue中」不空白,將設置爲「$行」到「布爾(真)」。

只是想感謝DRapp他的努力我會接受你的答案,如果我可以但由於問題與提供的任何信息無關,我相信它不會與SO飛行。這是其中的一個哦,我必須承認,我甚至猶豫了,因爲它幾乎在那裏等着忘記分號(;)等錯誤。但我希望它能幫助別人。

1

這是一個清理SQL查詢,沒有適當的引號包裝,但保留了適合您的參數。 LEFT-JOIN選擇對於爲查詢添加不必要的圖層毫無價值。

我簡化了別名引用,希望對您更有意義。爲了進行查詢,我嘗試從FROM子句開始,確定所有連接以及每個表的直接關係,以便根據需要獲取所有字段。在這一點上,不要擔心標準,只是它們是如何相關的。我也總是嘗試列出FIRST表作爲連接的ON子句的左側和連接到TO的右側的右側。此外,在服務加入到服務地址,然後服務地址到城市列表的情況下,請注意我是如何縮進的......這對於什麼鏈接而不是放在任何地方並希望沒有人在你後面有直接的意義需要弄清楚事情。當您不得不在稍後再回來時也更容易。

SELECT 
     S.rn AS srn, 
     S.Address_Id, 
     S.Customer_Id, 
     S.Service_Id, 
     S.Next_Service, 
     Next_End, 
     Confirmed, 
     SvcAdr.Address, 
     Cst.First_Name, 
     Cst.Last_Name, 
     Cst.Company, 
     SD.Service_Type, 
     C.City 
    FROM 
     Services AS S 
     LEFT JOIN Service_Address AS SvcAdr 
      ON S.Address_Id = SvcAdr.rn 
      LEFT JOIN City_List AS C 
       ON SvcAdr.City_Id = city.rn 
     LEFT JOIN Customer AS Cst 
      ON Services.Customer_Id = Cst.rn 
     LEFT JOIN Service_Desc AS SD 
      ON S.Service_Id = SD.rn 
    WHERE 
     S.Next_Service BETWEEN $daystart AND $dayend 
    ORDER BY 
     S.Customer_Id ASC, 
     S.Address_Id ASC, 
     S.rn ASC 

至於它不是通過PHP的工作,是可能是巧合,但也儘量總是限定適當表(或別名)你的域VS猜測。

服務日期的最後一點,它看起來像您使用的是基於UNIX的時間戳。我會確保開始是基於開始時的12:00:00(午夜)和最後一天的11:59:59 pm,所以你不會錯過任何可能是相應開始/結束日的中午的任何事情,結束日期。

反饋

然後我的建議。只從服務查詢開始,然後每次添加一個LEFT-JOIN。這些服務,只要去你的日期範圍。如果什麼都沒有回到那裏,你就會知道你的烤麪包。另外,由於您正在進行LEFT-JOIN,因此您可能需要將EXP:COALESCE(SvcAdr.Address,「」)作爲Address來防止空值回來。

開始

SELECT 
     S.rn AS srn, 
     S.Address_Id, 
     S.Customer_Id, 
     S.Service_Id, 
     S.Next_Service, 
    FROM 
     Services AS S 
    WHERE 
     S.Next_Service BETWEEN $daystart AND $dayend 
+0

這基本上是我的查詢的第一個版本的樣子。我試圖追蹤這個問題後,我的OP中的版本多次迭代。只是爲了確定我沒有看過我看過的東西,但是仍然是同樣的問題。 – Krik

+1

@Krik,修改了答案。嘗試從最低開始,以確保獲得答案並繼續添加,直到發生故障。 – DRapp

+0

好的建議,我想12小時會讓你忘記基本的調試。但它仍然失敗。我已檢查$ daystart和$ dayend是否已設置,並且它們是整數。幾個奇怪的筆記,var_dump有4個數組,但也是一個潛在的第五個數組將會是「NULL」的地方。在phpmyadmin中運行精確的精簡查詢,得到9個結果。所以有些東西正在返回NULL並停止查詢,我猜測。我再次檢查「Next_Service」設置爲整數,並且「Next_Service」列中的所有值都是數字。 – Krik

相關問題