0

我有两个表:

表 1:注释
在此处输入图像描述

表 2:联系人
在此处输入图像描述


我的基本目标是执行以下查询:
list * from contacts where(搜索文本存在于联系人中)或(搜索文本存在于该联系人的注释中)

我编写了以下代码来执行此操作:

<?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)。例如,当我给出搜索参数时,它显示以下输出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)

来自 Nida 的代码:

$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 回答