2013-04-20 131 views
0

我想在我的PHP文件上創建一個SQL SELECT語句,該語句可以選擇在列之一中具有未知數量不同值的所有行。爲了更好地解釋我會說確切的情況。我的數據庫中有三張表格;測試,類別,部分。每個測試屬於一個類別,大約有50個類別,每個類別屬於一個部分,共有10個部分。但是,在我的測試表中,它只包含它所屬類別的列。我現在想要能夠顯示一節中的所有測試。我可以在SQL SELECT語句中有一個循環嗎?

因此,爲了使事情更清晰:

SELECT * FROM tests WHERE category = '$categoryId' ORDER BY id ASC 

這讓我選擇一個特定的類別中的所有測試,但我希望做一些梳理,在那裏,這取決於哪一個環段被選中,類別編號被放在由OR分隔的這個語句中。謝謝。

+0

之前這樣做。在實際查詢之前創建您的OR語句,並將查詢字符串分配給變量categoryIds,然後執行'SELECT * FROM tests'。$ categoryIds。' ORDER BY id ASC' – user1048676 2013-04-20 20:01:09

+0

而且,請不要將categoryId變量插入到SQL語句中。看看這個問題爲什麼:http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work – 2013-04-20 20:18:15

回答

2
SELECT t.* 
FROM tests t 
    JOIN category c on t.category = c.id AND c.section = ' . $section . ' 
ORDER BY t.id ASC 

這是爲了向您展示在生產環境中應該清理$ section參數的方式。

這個想法是將表連接在一起,以利用強大的關係數據庫功能優於編程循環。

在內部,RDBMS正在爲您做循環,計算每個JOINed表的中間resulset。

+0

你美麗的人類。謝謝。 – 2013-04-20 21:19:32

+0

...你讓我的一天;) – Sebas 2013-04-20 21:22:13

0

如果你想選擇一個節中的所有測試,那麼你不應該使用或結類別的ID,而應使用連接這些表: 類似:

SELECT tests.* FROM (tests JOIN categories ON tests.category = categories.id) WHERE categories.section = $section 

其中$section是的id部分你想選擇測試。 您也可以指定要使用的列而不是*以僅選擇您感興趣的列。 $ section應該被轉義以確保它不能被注入。

我不知道你的表模式,但是當你有這些關係時,你應該在這些表中有外鍵,並且查詢應該很快,你只需要一個!這是如何在數據模型上執行查詢,因爲關係存儲在數據庫中。

0

對特例使用特殊字符pipe symbole | 並做到這一點:

$str="|".$cat1."|".$cat2."|".$cat3+"|"; 

,並使用像條件:

SELECT * FROM測試,其中$海峽LIKE '%|' + CAST(類別爲varchar)+ '|%' ORDER BY ID ASC

相關問題