0

这个有点复杂,不能通过 innerjoin 或类似的东西来完成。我已经得到了帮助,但我无法弄清楚。这就是我正在做的事情:在获得结果时,我需要从一个表中获取一行文本并将其插入到另一个表的查询中。在其中,我保存('2','3','4')了指向主表 ID 的链接。因此,为了得到它们,我必须先将它们从表中拉出,将它们插入到 php 中,然后将相关行拉出并将它们保存到 xml 中。这是重要的部分:

$name = ($_GET["name"]);
$query =  "SELECT Favorites FROM $table_id2 WHERE Name = $name";

while($favoritesstring = mysql_fetch_assoc(mysql_query($query, $dbconnect))){
$favoritestringresult = $favoritesstring['Favorites'];
} 

$string = stripslashes($favoritestringresult['Favorites']);

$query = "SELECT Name,Comment,ID FROM $table_id WHERE ID in " .$string;

$dbresult = mysql_query($query, $dbconnect) or die(mysql_error() . ' Query: ' . $query);
4

3 回答 3

3

警告:

请不要使用mysql_*函数来编写新代码。它们不再被维护并且社区已经开始了弃用过程。看到红框了吗?

相反,您应该了解准备好的语句并使用PDOMySQLi本文应该提供一些有关决定使用哪个 API 的详细信息。对于 PDO,这里有一个很好的教程

考虑以下数据库设置:

-- This contains the elements: books, videos, albums.
CREATE TABLE IF NOT EXISTS `entries` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) NOT NULL,
    `comment` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB;

-- This contains what our users favourited.
-- row_id: row identifier index
-- name: the name of the user to search for
-- entry_id: the id of the entry we search for, this will
--           make our JOIN relation towards entries.id
CREATE TABLE IF NOT EXISTS `favorites` (
    `row_id` int(10) NOT NULL AUTO_INCREMENT,
    `name` varchar(64) NOT NULL,
    `entry_id` int(10) NOT NULL,
    PRIMARY KEY (`row_id`)
) ENGINE=InnoDB;

当然放入一些任意数据:

INSERT INTO `entries` (`id`, `name`, `comment`) VALUES
    (1, 'Foobar', 'Bazqux'),
    (2, 'Barbaz', 'Quxfoo');

INSERT INTO `favorites` (`row_id`, `name`, `entry_id`) VALUES
    (1, 'someguy', 1),
    (2, 'someguy', 2),
    (3, 'person', 2);

我们将需要一个基本脚本来查询我们的数据库:

mysql_connect("localhost", "username", "password");
mysql_select_db("database");

$result = mysql_query('SELECT entries.id, entries.name, entries.comment
    FROM entries
    INNER JOIN favorites ON entries.id = favorites.entry_id
    WHERE favorites.name = "' .mysql_real_escape_string($_GET['name']). '"');

while ( $row = mysql_fetch_assoc($result) )
    var_dump($row);

mysql_close();

如果我们给出$_GET['name']的值someguy,我们的结果将是:

array (
  'id' => '1',
  'name' => 'Foobar',
  'comment' => 'Bazqux',
)
array (
  'id' => '2',
  'name' => 'Barbaz',
  'comment' => 'Quxfoo',
)

而使用 的值person,我们只会得到:

array (
  'id' => '2',
  'name' => 'Barbaz',
  'comment' => 'Quxfoo',
)

诀窍在于INNER JOIN. 我们的搜索模式,WHERE子句告诉数据库我们搜索输入的favorites.entry_id位置favorites.name。从那里开始,JOIN这两个表之间的链接扩展了我们的搜索。INNER JOIN意味着只有那些与 .entries.id相等的行才会被返回favorites.entry_id。当然,我们会获取SELECT语句中列出的字段。毕竟,这是我们告诉数据库要做的事情。 还有一些,视觉解释。

从这里,在while(){}构造内部,您可以对检索到的数据做任何您想做的事情。

无需获取所有 ID,然后将其插入到field IN (value1, value2)语句中,而是INNER JOIN利用 MySQL 的关系结构,从而获得更好的性能和可维护性。

正如我在与另一个人讨论类似问题时所说的那样:

您可以使用 MySQL 构建的复杂性有时可能超出想象。底线是,首先您需要确保您的数据库建模正确。在那之后,这只是你如何将一个字段链接到另一个字段的问题。phpMyAdmin、LibreOffice Base 或 Microsoft Access 等工具可以极大地帮助图形界面对键之间的关系进行建模。

于 2012-08-05T15:09:53.490 回答
1

通过查看您的两个查询,可以这样做:

"SELECT t1.ID, t1.Name, t1.Comment FROM $table_id t1 LEFT JOIN $table_id2 t2 ON t1.ID = t2.Favorites WHERE t2.Name = $name"

我在LEFT JOIN这里是因为$table_id实际上并不知道and之间的关系$table_id2

于 2012-08-04T14:30:36.817 回答
1

对此有许多可能的解决方案。一种是使用子查询:

SELECT  name, comment, id
FROM    table_id
WHERE   ID in   (
                    SELECT  Favorites
                    FROM    table_id2
                    WHERE   Name = $name
                )

另一个更有效的方法是使用INNER JOIN

SELECT a.ID, a.Name, a.Comment 
FROM    table_id a 
            INNER JOIN JOIN table_id2 b 
                ON a.ID = b.Favorites 
WHERE b.Name = $name
于 2012-08-04T14:45:34.390 回答