Продвинутый много-много запросов для MYSQL - PullRequest
2 голосов
/ 05 февраля 2010

Я пытаюсь создать фотогалерею, где люди имеют доступ к различным группам, и группы решают, какие каталоги и изображения им разрешено просматривать.
Я думаю, что многие структуры будут лучшими для этого.

Пока мне удается построить базу данных так:

image (image_name, image_file, image_id)
каталог (catalog_id, имя_каталога)
поставщик (идентификатор_поставщика, имя_поставщика)
пользователь (имя, идентификатор_пользователя)
image2cataloge (image_id, catalog_id)
image2supplier (image_id, supplier_id)
catalog2supplier (catalog_id, supplier_id)
user2supplier (идентификатор_пользователя, идентификатор_поставщика)

Итак ... как было сказано, сохранение изображений и создание поставщика (или группы, если хотите), добавление пользователей к поставщику и привязка изображений к поставщику и каталогам - не проблема. Вставка не проблема.
Но выбрать правильные изображения на основе настроек поставщика и каталога, в котором они находятся, сложнее.

Например, у меня есть пользователь с user_id 1, у которого есть доступ к supplier_id 1. Supplier_id 1 имеет доступ к просмотру каталога 1, который содержит изображения с image_id 1 и 2.
Но supplier_id 1 имеет доступ только к image_id 2.
Все эти настройки хранятся в базе данных. Как мне сделать запрос на выбор?

Это то, что я проверял;

// $ catalog_id - это каталог_id, в котором мы находимся
// $ user_id - текущие пользователи user_id

$sql = "SELECT i.*
FROM image i, user u, catalog cat, supplier s, supplier2user s2u, supplier2catalog s2c, image2catalog i2c, image2supplier i2s
WHERE u.id = '".$user_id."'
AND s2u.user_id = '".$user_id."'
AND s2u.supplier_id = s.id

AND s2c.catalog_id = '".$catalog_id."' 
AND i2c.catalog_id = '".$catalog_id."'

AND i2s.supplier_id = s.id
AND s2c.supplier_id = s.id

GROUP BY i.id
ORDER BY i.name ASC

Но когда я добавил более одного изображения, все изображения отображаются для всех пользователей во всех каталогах.

РЕДАКТИРОВАТЬ (2010/02/05):
Итак, я понял, как хотя бы показать правильные изображения в правильном каталоге. Я делаю это следующим образом:

$sql = "SELECT i.*
    FROM 
        image i
    INNER JOIN image2catalog i2c

    ON i.id = i2c.image_id
    AND i2c.catalog_id = '".$pages_level_0[$i]['id']."'

    GROUP BY i.id
    ;";

Это позволит мне вывести правильные изображения, которые принадлежат каталогу, который пользователь посещает в данный момент. Теперь мне просто нужно отредактировать этот запрос, чтобы отфильтровать все изображения, к которым у пользователя нет доступа. Я очень благодарен за любую помощь, которую вы можете оказать!

РЕДАКТИРОВАТЬ 2010/02/09:
---

СХЕМА СОЗДАНИЯ

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `email` varchar(250) NOT NULL,
  `password` varchar(50) NOT NULL
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

CREATE TABLE `imagebank` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(250) character set utf8 NOT NULL default '',
      `url` varchar(250) character set utf8 NOT NULL default '',
      `childof` varchar(250) character set utf8 NOT NULL default '',
      `hide` tinyint(4) NOT NULL,
      `publishdate` varchar(14) NOT NULL,
      `expiredate` varchar(14) NOT NULL,
      `editdate` varchar(14) NOT NULL,
      `editbygroup` varchar(250) NOT NULL,
      `openby` varchar(250) NOT NULL,
      `opendate` varchar(250) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci;

    CREATE TABLE `imagebank_image` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(250) NOT NULL,
      `img` varchar(250) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

    CREATE TABLE `imagebank_image2catalog` (
      `image_id` int(11) NOT NULL,
      `catalog_id` int(11) NOT NULL,
      PRIMARY KEY  (`image_id`,`catalog_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    CREATE TABLE `imagebank_image2supplier` (
      `image_id` int(11) NOT NULL,
      `supplier_id` int(11) NOT NULL,
      PRIMARY KEY  (`image_id`,`supplier_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    CREATE TABLE `imagebank_supplier` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(250) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

    CREATE TABLE `imagebank_supplier2catalog` (
      `supplier_id` int(11) NOT NULL,
      `catalog_id` int(11) NOT NULL,
      PRIMARY KEY  (`supplier_id`,`catalog_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    CREATE TABLE `imagebank_supplier2user` (
      `supplier_id` int(11) NOT NULL,
      `user_id` int(11) NOT NULL,
      PRIMARY KEY  (`supplier_id`,`user_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

НЕКОТОРЫЕ ДАННЫЕ:

INSERT INTO `imagebank` (`id`, `name`, `url`, `childof`, `hide`, `publishdate`, `expiredate`, `editdate`, `editbygroup`, `openby`, `opendate`) VALUES
(1, 'Test 1', 'test-1', '', 0, '20100204230233', '', '', '', '', ''),
(2, 'Test 2', 'test-2', '', 0, '20100204230244', '', '', '', '', '');

INSERT INTO `imagebank_image` (`id`, `name`, `img`) VALUES
(1, 'Test img 1', 'labb_9noq80bik5.jpeg'),
(2, 'Test img 2', 'labb_53626114dz.jpeg');

INSERT INTO `imagebank_image2catalog` (`image_id`, `catalog_id`) VALUES
(1, 1),
(2, 2);

INSERT INTO `imagebank_image2supplier` (`image_id`, `supplier_id`) VALUES
(1, 2),
(2, 1);

INSERT INTO `imagebank_supplier` (`id`, `name`) VALUES
(1, 'Supplier1'),
(2, 'Supplier2'),
(3, 'Supplier3');

INSERT INTO `imagebank_supplier2catalog` (`supplier_id`, `catalog_id`) VALUES
(1, 2),
(2, 1);

INSERT INTO `imagebank_supplier2user` (`supplier_id`, `user_id`) VALUES
(1, 1),
(1, 11),
(1, 12),
(2, 1),
(2, 10),
(3, 1);

INSERT INTO `user` (`id`, `email`, `password`) VALUES
(1, 'User1@test.com', 'ff02dd5s33taa2ba5ff7c2c4d3327e444'),
(10, 'User2@test.com', 'ff02dd5s33taa2ba5ff7c2c4d3327e444'),
(11, 'User3@test.com', 'ff02dd5s33taa2ba5ff7c2c4d3327e444'),
(12, 'User4@test.com', 'ff02dd5s33taa2ba5ff7c2c4d3327e444');

WOW, теперь это много вещей: P Итак, я знаю, что таблицы, специально для «каталогов», которые я называю просто «imagebank», могут выглядеть немного странно. Но у меня есть свои причины, и это на самом деле не проблема :) Это часть еще большей картины. Надеюсь, это поможет вам помочь мне. Еще раз спасибо.

1 Ответ

1 голос
/ 05 февраля 2010

Похоже, если вы передаете идентификатор пользователя и каталога, то поставщик не имеет значения.

Если в результате вам потребуется информация о поставщике, это будет другой вопрос.

Такое ощущение, что вам вообще не следует вовлекать пользователя в этот запрос, поскольку вы, похоже, ищете изображения в каталоге, принадлежащем конкретному поставщику.

Если это так, то я бы исключил требование для идентификатора пользователя в запросе и использовал бы вместо него идентификатор поставщика.

Я предполагаю, что пользователь сделал бы следующее, чтобы добраться до точки, где он будет инициировать этот запрос:

  • логин - очевидно :)
  • нажмите «список поставщиков»
  • нажмите на поставщика
  • кликните по каталогу

В любом случае вам придется делать много ВНУТРЕННИХ СОЕДИНЕНИЙ. Например, запрос на получение списка поставщиков для данного пользователя будет выглядеть примерно так:

SELECT 
    s.supplier_id, 
    s.Supplier_name
FROM
    supplier s
INNER JOIN
    user u
INNER JOIN
    user2supplier u2s
ON
    u.user_id = u2s.user_id
ON
    u2s.supplier_id = s.supplier_id
WHERE
    u.user_id = 3 -- for example...

(сейчас я не тестировал SQL, но думаю, что это правильно ...)

Дайте мне знать, если я на правильном пути - если бы я помог, я был бы рад помочь еще немного, если смогу

...