2014-10-29 66 views
0

我試圖與加入該查詢應該工作如下:查詢,加入和返回的ID從MySQL

  1. 成像的用戶的搜尋框輸入一個手機號碼或姓名。
  2. 結果應該是返回與下面兩個表中的搜索匹配的數據。

我想JOIN並返回其中IDCUSTOMER表id)和TASK表customer_id)是相同的數據。

我下面$sql查詢將返回TASK表正確的任務(一個或多個)數據([customer_id] => 5),但它總是從CUSTOMER表返回ID 1時,它應該從CUSTOMER表)返回ID 5。

我無法弄清楚我做錯了什麼?

我的SQL查詢例:

$sql = ("SELECT * FROM customer, task WHERE customer.id = task.customer_id LIKE 5 "); 

我的客戶表信息:

CREATE TABLE `customer` (
    `id` int(40) NOT NULL AUTO_INCREMENT, 
    `name` varchar(40) NOT NULL DEFAULT '', 
    `mobil` varchar(20) NOT NULL, 
    `email` varchar(50) NOT NULL DEFAULT '', 
    `Messages` varchar(200) NOT NULL DEFAULT '', 
    `adr` varchar(50) NOT NULL DEFAULT '', 
    `zip` int(4) NOT NULL, 
    `date_created` date NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; 

我的任務表信息:

CREATE TABLE `task` (
    `task_id` int(40) NOT NULL AUTO_INCREMENT, 
    `user_id` int(40) NOT NULL, 
    `customer_id` int(40) NOT NULL, 
    `date` datetime NOT NULL, 
    PRIMARY KEY (`task_id`), 
    KEY `customer_id` (`customer_id`), 
    KEY `user_id` (`user_id`), 
    CONSTRAINT `task_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`), 
    CONSTRAINT `task_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1; 

回答

1

我很驚訝這運行。讓我們來看看這個表情:

customer.id = task.customer_id LIKE 5 

牢記LIKE=都是二元運算符,這隻能是有意義的方式有兩種:

  1. 的平等首先被處理,布爾(0或1)的比較結果是LIKE--與5比較。
  2. 首先處理LIKE,然後將task.customer_id LIKE 5的布爾結果與customer.id字段進行比較。

According to the docs,這些運算符具有相同的優先級。然而,考慮到你的結果(一個ID爲1的記錄),看起來第二個選項實際上正在發生。由於有一個值爲5的task.customer_id,因此該條件通過; LIKE表達式的布爾結果是1,因此可以得到customer.id爲1的記錄。

我們可以通過將LIKEAND分開來進行修正。當我們處理它時,讓我們拋棄過時的A,B加入語法:

SELECT * 
FROM customer 
INNER JOIN task ON customer.id = task.customer_id 
WHERE customer.id LIKE 5 
+0

讓我想起這個查詢實際上是在所有的執行;猜猜MySQL解析器是相當寬容的。在一個側面說明,也許跳過'LIKE'to,因爲你可能會使用平等'=':) – jpw 2014-10-29 14:27:57

+0

@jpw我不是MySQL的粉絲,這就是爲什麼(這個視頻涵蓋了一些其他人:https://www.youtube.com/watch?v = emgJtr9tIME) – 2014-10-29 14:41:58

+0

事實上,我以前看過那個視頻,有些可怕的東西...... Postgresql似乎是開源dbms更好的選擇。 – jpw 2014-10-29 14:42:49

0

嘗試:

SELECT * FROM customer join task on customer.id = task.customer_id where customer.id = 5