0

私は2つのテーブルを持っています:

表1:メモ
ここに画像の説明を入力してください

表2:連絡先
ここに画像の説明を入力してください


私の基本的な目的は、次のクエリを実行することです。
リスト*(検索テキストが連絡先に存在する)または(検索テキストがその連絡先のメモに存在する)連絡先から

私はこれを行うために次のコードを書きました:

<?php
require_once('config.php');

$nwhere = "WHERE note_text LIKE '%".addslashes($_GET['s'])."%' ";
$cwhere = "contact_text LIKE '%".addslashes($_GET['s'])."%' ";
$result = mysql_query("SELECT * FROM contacts INNER JOIN notes ON contact_id = note_contact $nwhere OR $cwhere ORDER BY contact_id");

while($row = mysql_fetch_array($result))
{
echo $row['contact_id'];
echo '<br/>';
}
?>

Search Textがazeemの場合、上記のコードは印刷されるだけです4001が、出力は次のようになります
。4000
4001

また、私contact_idは出力で繰り返したくありません。
提案してください。



Fluffeh による修正後のコード:

$where_clause = " where contacts.contact_text like '%".addslashes($_GET['s'])."%' or    notes.note_text like '%".addslashes($_GET['s'])."%'";
$result = mysql_query("select notes.note_id, notes.note_contact, contacts.contact_id,  contacts.contact_text, notes.note_text from contacts left outer join notes on contacts.contact_id=notes.note_contact $where_clause");
while($row = mysql_fetch_array($result))
{
echo $row['contact_id'];
echo '<br/>';
}
?>


このコードはテーブルから正しい行を取得しますが、出力(contact_id)を繰り返すという小さな問題が1つあります。たとえば、検索パラメータを指定すると、次の出力が表示されますnawaz
4001
4001
4001
4001
4001
4002
4003

あなたの助けをありがとう、これを修正するために私を助けてください。

4

1 に答える 1

2

列を繰り返したくない場合は使用できませんSELECT * FROMが、選択する列名を使用する必要があります。

他のテーブルに存在しないフィールドで内部結合を実行しているため、期待した4000の結果が得られません。(Azeem = 4000ですが、ユーザー4000のnote_contactは存在しません)。

代わりに、外部結合への切り替えを検討する必要があります。多分このようなもの:

select
    a.note_id,
    a.note_contact,
    b.contact_text,
    b.note_text
from
    contacts a
        left outer join notes b
            on a.contact_id=b.note_contact
where
    a.contact_text like '%azeem%'
    or b.note_text like '%azeem%'

編集:私たちは両方ともまだ働いていたようです-私は、例のために基本的なスキーマと機能する外部結合を持つsqlFiddleを作成しました。

私の作成スキーマは次のとおりです。

mysql> CREATE TABLE `contacts` (
    ->   `contact_id` int(4) DEFAULT NULL,
    ->   `contact_text` varchar(40) DEFAULT NULL,
    ->   `contact_email` varchar(40) DEFAULT NULL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> CREATE TABLE `notes` (
    ->   `note_id` int(3) NOT NULL AUTO_INCREMENT,
    ->   `note_contact` int(4) DEFAULT NULL,
    ->   `note_text` tinytext,
    ->   PRIMARY KEY (`note_id`)
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> INSERT INTO `contacts` (`contact_id`, `contact_text`, `contact_email`) VALUES
    -> (4000, 'azeem', 'azeem@big.com'),
    -> (4001, 'nawaz', 'azeem@big.com'),
    -> (4002, 'nawaz', 'azeem@big.com');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> 
mysql> INSERT INTO `notes` (`note_id`, `note_contact`, `note_text`) VALUES
    -> (1, 4001, 'I am text1'),
    -> (2, 4001, 'I am text2'),
    -> (3, 4001, 'my name is azeem'),
    -> (4, 4001, 'come here'),
    -> (5, 4001, 'I don''t want to'),
    -> (6, 4003, 'My text is clear.');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

外部結合クエリ:

mysql> select
    -> b.note_id,
    -> b.note_contact,
    -> a.contact_text,
    -> b.note_text
    -> from
    -> contacts a
    -> left outer join notes b
    -> on a.contact_id=b.note_contact
    -> where
    -> a.contact_text like '%azeem%'
    -> or b.note_text like '%azeem%';
+---------+--------------+--------------+------------------+
| note_id | note_contact | contact_text | note_text        |
+---------+--------------+--------------+------------------+
|    NULL |         NULL | azeem        | NULL             |
|       3 |         4001 | nawaz        | my name is azeem |
+---------+--------------+--------------+------------------+
2 rows in set (0.00 sec)

ニダからのコード:

$where_clause = " where contacts.contact_text like '%".addslashes($_GET['s'])."%' or notes.note_text like '%".addslashes($_GET['s'])."%'";
$result = mysql_query("select distinct contacts.contact_id from contacts left outer join notes on contacts.contact_id=notes.note_contact $where_clause")
于 2012-08-19T10:42:56.123 に答える