2

mysql クエリから検索スクリプトを実行しています。display_name または location がクエリに似ている場合、一致するユーザーをデータベースから取得します。ユーザーの表示名を検索すると、次のようにユーザーごとに 1 つの結果しか得られません。

検索 'Tom' = tom = 1.tom davies と 2.tom smith の 2 つの結果。

なんらかの理由で、場所、つまりマンチェスターを検索すると、次のように各ユーザーの結果が複製されます。

トム・デイヴィス トム・デイヴィス トム・デイヴィス トム・デイヴィス トム・スミス トム・スミス トム・スミス トム・スミス

誰かがこれを止める方法を説明してもらえますか. 同じユーザーを何度も表示するのではなく、検索クエリに一致するユーザーごとに 1 つの結果のみを表示するようにします。ptb_users と ptb_profiles からのすべての選択と関係があると確信していますが、ptb_users にある「アカウントの種類」と「account_status」を含める必要があります。

ありがとう

<?php
//PHP CODE STARTS HERE

if(isset($_GET['submit'])){

// Change the fields below as per the requirements
$db_host="localhost";
$db_username="root";
$db_password="";
$db_name="database";
$db_tb_atr_name="display_name";

//Now we are going to write a script that will do search task
// leave the below fields as it is except while loop, which will display results on screen

mysql_connect("$db_host","$db_username","$db_password");
mysql_select_db("$db_name");

$query=mysql_real_escape_string($_GET['query']);

$query_for_result=mysql_query("SELECT *
                        FROM ptb_users, ptb_profiles
                        WHERE ptb_users.account_type = \"User\" AND ptb_users.account_status = \"Active\" AND ptb_profiles.user_id = ptb_users.id AND display_name like '%".$query."%' 
        OR location LIKE '%".$query."%' OR age LIKE '%".$query."%'");
echo "<div class=\"results\">";
while($data_fetch=mysql_fetch_array($query_for_result))
{
    echo "<div class=\"spacing\"><a href=\"profile.php?id={$data_fetch['user_id']}\">";
    echo substr($data_fetch[$db_tb_atr_name], 0,160);
    echo "</a></div>";

}


mysql_close();
}

?>
4

3 に答える 3

3

LIMIT 句を使用する

"SELECT * FROM ptb_users, ptb_profiles
WHERE ptb_users.account_type = \"User\" AND ptb_users.account_status = \"Active\" AND 
ptb_profiles.user_id = ptb_users.id AND display_name like '%".$query."%' 
        OR location LIKE '%".$query."%' OR age LIKE '%".$query."%' LIMIT 1"
于 2012-10-31T19:23:09.317 に答える
0

なんというクエリ...基本的には、distinctまたはgroupbyのいずれかを使用できます...

"SELECT * FROM ptb_users, ptb_profiles WHERE ptb_users.account_type = \"User\" 
AND ptb_users.account_status = \"Active\" AND ptb_profiles.user_id = ptb_users.id 
AND display_name like '%".$query."%' OR location LIKE '%".$query."%' 
OR age LIKE '%".$query."%' GROUP BY display_name"

グループ化:http ://www.tizag.com/mysqlTutorial/mysqlgroupby.php

明確:http ://www.w3schools.com/sql/sql_distinct.asp

LIMITを使用して、返される行の量を制限することもできます。たとえば、クエリの最後にLIMIT 10を追加すると、最大10行しか返されません。

于 2012-10-31T19:33:03.190 に答える
0

ptb_users と ptb_profiles に参加する必要があるように見えますか? 例えば

SELECT * 
FROM ptb_users AS u
INNER JOIN ptb_profiles AS p ON u.id = p.user_id
WHERE u.account_type = \"User\"
    AND u.account_status = \"Active\"
    AND u.display_name like '%".$query."%' 
    OR p.location LIKE '%".$query."%'
    OR u.age LIKE '%".$query."%'
GROUP BY u.display_name
于 2012-10-31T19:29:01.150 に答える