加入两个表问题

时间:2012-08-19 10:40:20

标签: php sql phpmyadmin

我有两张桌子:

表-1:注释
enter image description here

表-2:联系人
enter image description here


我的基本目标是执行以下查询:
来自联系人的列表*(搜索文本存在于联系人中)或(搜索文本存在于该联系人的备注中)

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

<?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/>';
}
?>

当搜索文本为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

感谢您的帮助,请帮我解决此问题。

1 个答案:

答案 0 :(得分: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")