讓我們從我相信你已經擁有的東西開始。這是一個sscce。如果您調整mysql憑據,它應該在您的系統上運行,只創建一個臨時MySQL表。它使用PDO訪問MySQL服務器。其API 你實際使用並不重要(即只要其他的API是mysqli的,因爲mysql_ *函數are depreacted ;-))
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
PDO::ATTR_EMULATE_PREPARES=>false,
PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));
setup($pdo);
$statement = $pdo->prepare('
SELECT
*
FROM
soFoo
WHERE
FIND_IN_SET(:right, rights)
');
$statement->execute(array(':right'=>5));
/* in one way or another you have a loop where you fetch the records
having '5' in the `rights` field
*/
foreach($statement as $row) {
echo $row['party'], ' ', $row['show_ids'], "\r\n";
}
function setup($pdo) {
$pdo->exec('
CREATE TEMPORARY TABLE soFoo
(`id` int, `party` varchar(9), `exc` varchar(13), `rights` varchar(5), `show_ids` varchar(27))
');
$pdo->exec(<<< eos
INSERT INTO soFoo
(`id`, `party`, `exc`, `rights`, `show_ids`)
VALUES
(9, 'Percept', 'Non-Exclusive', '3,5,6', '["12,","15,"6"]'),
(20, 'Tata Sky', 'Non-Exclusive', '5,4,', '["6,","9,"11"]'),
(21, 'Tata Sky', 'Exclusive', '5,4', '["6,","13","15,"2","4","9"]'),
(22, 'Simbiotic', 'Exclusive', '6,2', '["12,","15,"1","6","7","8"]')
eos
);
}
此打印
Percept ["12,","15,"6"]
Tata Sky ["6,","9,"11"]
Tata Sky ["6,","13","15,"2","4","9"]
是(因爲我理解這個問題),只要你已經有了。
現在讓我們decode the JSON array和檢查whether it contains元素9
。如果它不從當前行添加inforamtion到一個數組稱爲$parties
$parties = array();
/* in one way or another you have a loop where you fetch the records
having '5' in the `rights` field
*/
foreach($statement as $row) {
$ids = json_decode($row['show_ids'], true);
if (in_array('9', $ids)) {
$parties[$row['id']] = $row['party'];
}
}
var_export($parties);
打印
array (
20 => 'Tata Sky',
21 => 'Tata Sky',
)
但是......但從這是次優的....關係數據庫點。
FIND_IN_SET子句妨礙MySQL有效地使用索引;您正在搜索(複合)數據在之內的單個字段。數據庫服務器實現可以做些什麼來提高性能是令人驚訝的;但它有限制。
而且您還將可能不必要的數據從MySQL服務器傳輸到php實例(那些5
在rights
但不是9
在show_ids
中的記錄)。如果可能,應該避免這種情況。網絡/網絡堆棧速度快,可以進行優化,RAM很便宜......但同樣存在限制。
所以,我建議你一方面看Database normalization和/或另一方面看document-oriented databases。
「等等都屬於派對桌」 - 瘋狂猜測模式:有一個sql查詢涉及到哪裏?如果有問題,請將其添加到您的問題。如果沒有,請提供您在php腳本中可用的實際數據(結構)。 – VolkerK
我已經打倒了表格的形象@VolkerK – piyuu
仍然令人困惑。起初你寫「右5包含三個表演ID」,然後「例如:輸出權9:派對2,派對3」。請詳細說明。我可以進入瘋狂的猜測模式:您正在尋找所有在'shows_id'字段的'rights'和_9'列中都有'5'的行嗎?但是這會立即導致我提出一個[數據庫規範化](https://en.wikipedia.org/wiki/Database_normalization);-) – VolkerK