Я использую Sphinx Search для поиска элементов на моем веб-сайте. Я использую foreach для поиска индекса, откуда исходит поиск? Цикл Foreach будет перебирать все элементы, соответствующие поисковому запросу, и будет определять индекс.
Все элементы в базе данных имеют user_id, который ссылается на пользователя из пользовательской таблицы. Итак, я хочу вывести несколько элементов (выполнить поиск) и соединить их вместе с этим пользователем. Если выполнить поиск «Book», затем вывести «Вот так»
Alex //Book1,Book2,Book3 all of them has user_id of 2 which refers to Alex
Book1
Book2
Book3
Jordan //Book11,Book12,Book18 all of them has user_id of 5 which refers to Joradn
Book11
Book12
Book18
and so on.
Вот код для этого
foreach ( $res["matches"] as $doc => $docinfo ) {
switch($docinfo['attrs']['table_id']) {
case 1: //if search come from index 1
$res_db = mysqli_query($connect3,'select id_2, image, user_id, title, detail from lunch_menu where id_2 = (('.$doc.'-300000))');
if ($res_db === false) {
echo "Error in mysql query #" . mysqli_errno($connect) . ' - ' . mysqli_error($connect);
} else {
$row = mysqli_fetch_assoc($res_db);
$connect4=mysqli_connect('localhost', 'root', '','user');
$sql2="SELECT * FROM `user`.`user_det` WHERE id='".$row['user_id']."' GROUP BY id ORDER
BY id DESC";
$query2=mysqli_query($connect4,$sql2);
while($row2 = mysqli_fetch_assoc($query2)){ //line X
$userx=$row2['id'];
$image=$row2['img'];
$busi_title=$row2['busi_title'];
$page_owner.="<img src='../../account/$userx/$image' width='140'
height='140'><b>$busi_title</b><hr>";
$res_db2 = mysqli_query($connect3,'select id_2, image, user_id, title, detail from
lunch_menu where id_2 in ((' . $doc . '-300000)) order by field(id_2,('.$doc.'-300000))');
$alu="";
while($row3 = mysqli_fetch_assoc($res_db2)){
$alu.=
'<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">'
. '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . $row3['title'] . '<a>'
. '<br/> '.$row3['detail'].'<br><br><br><br>' ;
}
$all.="<div id='' style='border:2px solid black;'>".$page_owner.".".$alu."</div>";
}
}
Но приведенный выше код дает мне такой результат
Alex
Book1
Alex
Book2
Alex
Book3
Jordan
Book11
Jordan
Book12
Jordan
Book18
and so on.
Какие изменения мне нужны, чтобы заставить мой код работать так, как ожидалось. Я старался изо всех сил, чтобы найти решение, но не помогло. Так что, просто создал учетную запись SO, чтобы опубликовать вопрос.
Пожалуйста, помогите, если сможете. Это было бы действительно здорово.
заранее спасибо
Спасибо Райан за ваш ответ. Мы почти на месте
Еще 1 исправление, тогда мы закончили. Теперь я получаю
Problem
Result is almost the way,I was looking for except for the first one.This is what I'm getting
Alex
Book1
Jordan
Book11
Book12
Book18
Alex
Book2
Book3
Если я могу сделать временный order by user_id
прежде чем эхо $all
эта ошибка может быть исправлена.
Так как $all
печать user
И его corresponding item
как это отсортировано в базе данных
Пожалуйста, будьте в курсе, я использую второй способ, как вы показали. Первый не работает.
Я разобрался со второй частью проблемы. Чтобы добиться желаемого результата, мне нужно было это сделать.
$cl->SetSortMode(SPH_SORT_EXTENDED, '@relevance DESC,user_id ASC');
Эта строка кода сначала выводит наиболее релевантные результаты поиска и классифицирует по user_id
По возрастанию.
Special Thanks to Ryan
Поэтому я немного озадачен тем, откуда происходит дубликат пользователя, поскольку я не знаю точно, к чему вы обращаетесь, но у меня есть идеи, что может быть причиной.
Во-первых, если проблема заключается во внутреннем цикле, это простое решение. Показывать ‘user_id’ только в первом цикле.
$alu="";
$firstLoop = true;
while($row3 = mysqli_fetch_assoc($res_db2)){
if($firstLoop){
$alu.= '<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">'
$firstLoop = false;
}
$alu.= '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . row3['title'] . '<a>'
. '<br/> '.$row3['detail'].'<br><br><br><br>' ;
}
В качестве альтернативы, это может происходить в внешней петле, как предложил Шон. В этом случае мы можем просто следить за предыдущим пользователем, чтобы определить, следует ли установить $ userx и использовать $ page_owner.
$prevUsr = '';
foreach ( $res["matches"] as $doc => $docinfo ) {
switch($docinfo['attrs']['table_id']) {
case 1: //if search come from index 1
$res_db = mysqli_query($connect3,'select id_2, image, user_id, title, detail from lunch_menu where id_2 = (('.$doc.'-300000))');
if ($res_db === false) {
echo "Error in mysql query #" . mysqli_errno($connect) . ' - ' . mysqli_error($connect);
} else {
$row = mysqli_fetch_assoc($res_db);
$connect4=mysqli_connect('localhost', 'root', '','user');
$sql2="SELECT * FROM `user`.`user_det` WHERE id='".$row['user_id']."' GROUP BY id ORDER
BY id DESC";
$query2=mysqli_query($connect4,$sql2);
while($row2 = mysqli_fetch_assoc($query2)){
$userx=$row2['id'];
$image=$row2['img'];
$busi_title=$row2['busi_title'];
$page_owner.="";
// only set the page owner if the user id is different
if($prevUsr != $userx){
$page_owner.="<img src='../../account/$userx/$image' width='140'
height='140'><b>$busi_title</b><hr>";
$prevUsr = $userx;
}
$res_db2 = mysqli_query($connect3,'select id_2, image, user_id, title, detail from
lunch_menu where id_2 in ((' . $doc . '-300000)) order by field(id_2,('.$doc.'-300000))');
$alu="";
while($row3 = mysqli_fetch_assoc($res_db2)){
$alu.=
'<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">'
. '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . $row3['title'] . '<a>'
. '<br/> '.$row3['detail'].'<br><br><br><br>' ;
}
$all="<div id='' style='border:2px solid black;'>".$page_owner.".".$alu."</div>";
}
}
Я надеюсь, что один из них поможет вам.
Удачного кодирования.
Райан
Других решений пока нет …