【问题标题】:How to compare comma separated values and with two different ids-php mysql如何比较逗号分隔值和两个不同的 ids-php mysql
【发布时间】:2013-09-19 12:16:01
【问题描述】:

显示的人的照片只是假数据。 这是我的表结构

id   |作者    |合著者

1    |罗尼 |维奈、戈帕尔、阿伦
2    |剃须刀     | karthick, 韦伯斯特, 明
3    |塔兹        |伯爵, karthick, vinay
4    |男爵    |戈帕尔、阿伦、桑吉夫

现在我要选择两位作者,分别是 ronnie 和 baron,所以现在应该比较他们的共同作者。在这种情况下,匹配项是 gopal, arun,所以输出应该是 gopal 和 arun。

如何在 mysql 查询中做到这一点。请帮忙。

【问题讨论】:

  • 你的表结构很糟糕。您应该有一个表结构,每个作者和他们创作的作品一行。那么你的查询会更容易表达。
  • 是的,共同作者也有不同 id 的单独行
  • 。 .然后显示该表结构。另外,请选择您真正使用的数据库。
  • 我已经附上了截图兄弟,你知道了吗?
  • 所以如果你看图片,有两个共同作者匹配一个是 sreeram 一个是 frank kruzel ,所以只有这两个作者必须显示。

标签: php mysql sql optimization


【解决方案1】:

这是您项目的建议结构。在您的情况下,可能是articles 表,而不是books 或作者和合著者相关的任何其他内容。通过这种方式,之后对您的数据进行查询会容易得多:

SQL Fiddle

MySQL 5.5.32 架构设置

CREATE TABLE books
    (`id` int, `title` varchar(5));

INSERT INTO books
    (`id`, `title`)
VALUES
    (1, 'book1'),
    (2, 'book2'),
    (3, 'book3'),
    (4, 'book4');

CREATE TABLE authors
    (`id` int, `name` varchar(8));

INSERT INTO authors
    (`id`, `name`)
VALUES
    (1, 'Ronnie'),
    (2, 'Razor'),
    (3, 'Taz'),
    (4, 'Baron'),
    (5, 'vinay'),
    (6, 'karthick'),
    (7, 'earl'),
    (8, 'gopal'),
    (9, 'webster'),
    (10, 'karthick'),
    (11, 'arun'),
    (12, 'ming'),
    (13, 'sanjeev');

CREATE TABLE type
    (`id` int, `type` varchar(9));

INSERT INTO type
    (`id`, `type`)
VALUES
    (1, 'author'),
    (2, 'co-author');

CREATE TABLE wrote
    (`id` int, `book_id` int, `author_id` int, `type_id` int);

INSERT INTO wrote
    (`id`, `book_id`, `author_id`, `type_id`)
VALUES
    (1, 1, 1, 1),
    (2, 2, 2, 1),
    (3, 3, 3, 1),
    (4, 4, 4, 1),
    (5, 1, 5, 2),
    (6, 2, 6, 2),
    (7, 3, 7, 2),
    (8, 4, 8, 2),
    (9, 1, 8, 2),
    (10, 2, 9, 2),
    (11, 3, 10, 2),
    (12, 4, 11, 2),
    (13, 1, 11, 2),
    (14, 2, 12, 2),
    (15, 3, 5, 2),
    (16, 4, 13, 2);

这是您的实际数据:

查询 1

SELECT b.id, a.name as author, group_concat(co.name) as co_authors
FROM books b
INNER JOIN wrote wa ON wa.book_id = b.id AND wa.type_id = 1
INNER JOIN authors a ON wa.author_id = a.id 
INNER JOIN wrote wco ON wco.book_id = b.id AND wco.type_id = 2
INNER JOIN authors co ON wco.author_id = co.id
GROUP BY b.title, a.name

Results

| ID | AUTHOR |            CO_AUTHORS |
|----|--------|-----------------------|
|  1 | Ronnie |      arun,vinay,gopal |
|  2 |  Razor | webster,ming,karthick |
|  3 |    Taz |   earl,karthick,vinay |
|  4 |  Baron |    sanjeev,gopal,arun |

这就是你想要做的。

注意AND a.id in (1,4); 其中id 1Ronnieid 4Baron

查询 2

SELECT co.name as coauthor
FROM books b
INNER JOIN wrote wa ON wa.book_id = b.id AND wa.type_id = 1
INNER JOIN authors a ON wa.author_id = a.id AND a.id in (1,4)
INNER JOIN wrote wco ON wco.book_id = b.id AND wco.type_id = 2
INNER JOIN authors co ON wco.author_id = co.id 
GROUP BY co.name
HAVING count(co.name) > 1

Results

| COAUTHOR |
|----------|
|     arun |
|    gopal |

【讨论】:

  • 那是非常好的兄弟,但我也在使用 php,现在我完全糊涂了。
  • 我对书桌感到困惑,因为我没有那个东西。
  • 他们有不同的学科领域
  • 所以你将有一个subject_areas 表而不是books
  • 是的兄弟,但布局有些不同
【解决方案2】:

试试这样的:

一个名为 Authors 的表(把所有的作者和共同作者都放在这个表中)

id  |  Author
1   |  Bob
2   |  Jim
3   |  Sally
4   |  Joan

然后是作者之间的关系表

id  |  authorid  |  coauthorid
1   |  1         |  4
2   |  2         |  3
3   |  1         |  3

等等。每个作者/共同作者关系占一行。

【讨论】:

  • 你能给我一个mysql查询建议吗
  • 您只需进行连接以从 coauthorid 的作者表中获取作者 ID。因此,您将获取与作者关联的所有共同作者 ID,并使用该 ID 从作者表中获取名称。
猜你喜欢
  • 2010-12-09
  • 1970-01-01
  • 2018-03-07
  • 2020-02-02
  • 2012-10-29
  • 1970-01-01
  • 2020-02-01
  • 2020-02-04
  • 1970-01-01
相关资源
最近更新 更多