Имам следната заявка:
$query_q_pass = sprintf("SELECT * FROM answers INNER JOIN users WHERE a_id = %s and answers.user_id = users.user_id");
$q_pass = mysql_query($query_q_pass, $cd) or die(mysql_error());
$row_q_pass = mysql_fetch_assoc($q_pass);
Сега отговори таблицата от горната заявка има ред brand_url който има много различни стойности, разделени със запетаи, напр. dell, microsoft, hp, ...
Това, което искам да направя, е да избера всички тези стойности от brand_url row и ги добавете в друга заявка, където ще извлека всички марки, които съществуват вътре brand_url, Това е другата заявка:
$query_conn_brands = "SELECT * FROM brands WHERE brand_url = "VALUE FROM ABOVE QUERY"";
$conn_brands = mysql_query($query_conn_brands, $cd) or die(mysql_error());
$row_conn_brands = mysql_fetch_assoc($conn_brands);
$totalRows_conn_brands = mysql_num_rows($conn_brands);
Опитах много различни начини използване масиви, но всичко, което получавам, са всички резултати от марки таблица. Това е последният ми неуспешен опит:
$brand_pass_ids = $row_q_pass["brand_id"];
$array = array($brand_pass_ids,);
$query_conn_brands = "SELECT * FROM brands WHERE brand_url IN (" . implode(",", array_map("intval", $array)) . ")";
$conn_brands = mysql_query($query_conn_brands, $cd) or die(mysql_error());
$row_conn_brands = mysql_fetch_assoc($conn_brands);
$totalRows_conn_brands = mysql_num_rows($conn_brands);
От горния пример всичко, което получавам, е ВСИЧКИ резултати марки масата, а не само тези, които съществуват вътре отговори таблица. Надявам се някой да ми помогне с това.
Благодаря много!
Отговори:
1 за отговор № 1Използвайте MySQL FIND_IN_SET()
функция:
Връща стойност в диапазона от 1 до
N
ако низътstr
е в списъка с низовеstrlist
състоящ се от N подсъздатия. Списъкът на низовете е низ, съставен от подзаписи, разделени с ",
"Знаци. Ако първият аргумент е постоянен низ, а вторият е колона от типаSET
,FIND_IN_SET()
функцията е оптимизирана за използване на битово аритметично. Се завръща0
акоstr
не е вstrlist
или акоstrlist
е празният низ. Се завръщаNULL
ако има някой от аргументитеNULL
, Тази функция не работи правилно, ако първият аргумент съдържа запетая (",
").MySQL> ИЗБЕРЕТЕ FIND_IN_SET ("b", "a, b, c, d"); -> 2
Във вашия случай:
SELECT * FROM brands WHERE FIND_IN_SET(brand_url, ?)
Но бихте могли да се присъединят към вашите заявки заедно по желание:
SELECT *
FROM answers
JOIN users USING (user_id)
JOIN brands ON FIND_IN_SET(brands.brand_url, answers.brand_url)
WHERE a_id = %s
1 за отговор № 2
Причината за това е, че заявката ви ще изглежда така:
SELECT * FROM brands WHERE brand_url IN (dell,microsoft,hp)
Има низови стойности и трябва да се обработват като струни. Опитвам:
implode(",",array_map(function($a) {return json_encode($a);},$array))
Въпреки че кодирането като JSON може да изглежда лудо, това всъщност е добър избор тук. Струнките са увити в кавички и избягали според нуждите, числата са оставени така, както са, и null
се обработва също така правилно.
РЕДАКТИРАНЕ: За по-стари версии на PHP, които не поддържат анонимни функции:
implode(",",array_map(create_function("$a","return json_encode($a);"),$array));