За последние 24 часа нас посетили 16470 программистов и 1671 робот. Сейчас ищет 891 программист ...

Sql Запрос

Тема в разделе "PHP для новичков", создана пользователем wir_wolf, 26 авг 2010.

  1. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Есть 2 таблицы, таблица меню и таблица подменю.
    вот их структура.
    [sql]SQLyog Enterprise - MySQL GUI v6.14
    MySQL - 5.1.41 : Database - project_1
    *********************************************************************
    */


    /*!40101 SET NAMES utf8 */;

    /*!40101 SET SQL_MODE=''*/;

    create database if not exists `porject_1`;

    USE `porject_1`;

    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

    /*Table structure for table `menu` */

    DROP TABLE IF EXISTS `menu`;

    CREATE TABLE `menu` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` char(40) NOT NULL,
    `type` int(11) NOT NULL,
    `bg` tinytext,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1027 DEFAULT CHARSET=latin1;

    /*Data for the table `menu` */

    insert into `menu`(`id`,`name`,`type`,`bg`) values (1001,'contact',2,'bg_page1.jpg'),(1000,'bio',2,'dark-abstract-wide-wallpaper-1920x1200-001.jp'),(21,'advertisement',1,''),(19,'weddings',1,''),(16,'fashion',1,NULL),(25,'video',1,''),(1,'home',2,'rand'),(15,'beauty',1,'');

    /*Table structure for table `menu_subcats` */

    DROP TABLE IF EXISTS `menu_subcats`;

    CREATE TABLE `menu_subcats` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `menu_name` char(40) DEFAULT NULL,
    `value` char(40) DEFAULT NULL,
    `type` int(1) DEFAULT NULL,
    `bg` char(50) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=69 DEFAULT CHARSET=latin1;

    /*Data for the table `menu_subcats` */

    insert into `menu_subcats`(`id`,`menu_name`,`value`,`type`,`bg`) values (1,'beauty','beauty',1,NULL),(2,'beauty','fantasi',1,NULL),(3,'fashion','fashion',1,NULL),(4,'fashion','creative',1,NULL),(5,'weddings','weddings',1,NULL),(6,'weddings','hairs',1,NULL),(7,'advertisement','advertisement',1,NULL),(8,'advertisement','celebrities',1,NULL),(9,'advertisement','editorial',1,NULL);

    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    [/sql]
    Как выбрать имена из обоих таблиц так, чтобы не было повторов?
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    ещё раз, какие записи должен вернуть mysql?

    [sql]
    SELECT menu.id, menu.name, menu.type, menu_subcats.value
    FROM menu INNER JOIN menu_subcats ON (menu.name = menu_subcats.menu_name);
    [/sql]
    Код (Text):
    1.  
    2. +----+---------------+------+---------------+
    3. | id | name          | type | value         |
    4. +----+---------------+------+---------------+
    5. | 15 | beauty        |    1 | beauty        |
    6. | 15 | beauty        |    1 | fantasi       |
    7. | 16 | fashion       |    1 | fashion       |
    8. | 16 | fashion       |    1 | creative      |
    9. | 19 | weddings      |    1 | weddings      |
    10. | 19 | weddings      |    1 | hairs         |
    11. | 21 | advertisement |    1 | advertisement |
    12. | 21 | advertisement |    1 | celebrities   |
    13. | 21 | advertisement |    1 | editorial     |
    14. +----+---------------+------+---------------+
    15. 9 rows in set (0.00 sec)
    Оно?

    [sql]SELECT menu.*
    FROM menu
    INNER JOIN menu_subcats ON (menu.name = menu_subcats.menu_name)
    GROUP BY name;[/sql]
    Код (Text):
    1. +----+---------------+------+------+
    2. | id | name          | type | bg   |
    3. +----+---------------+------+------+
    4. | 21 | advertisement |    1 |      |
    5. | 15 | beauty        |    1 |      |
    6. | 16 | fashion       |    1 | NULL |
    7. | 19 | weddings      |    1 |      |
    8. +----+---------------+------+------+
    9. 4 rows in set (0.00 sec)

    porject_1 -> project_1
    menu_subcats (меню подкошек?)
     
  3. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Нет, чучуть не то, в запросах нет раздела видео. Нужно выбрать все значения из menu_subcats.value и menu.name так чтобы не было повторений
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    INNER JOIN меняем на LEFT JOIN
     
  5. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    все это прекрасно можно (и нужно) сделать одной таблицей.
    твой метод - избыточен, к тому же не обеспечивает целостность данных.
    делай в одной таблице.
    добавь поле parent_id, если его значение null, значит это верхний уровень меню, если не нулл, значит это субменю.
    и сделай foreign key по этому полю, который будет вязать таблицу на саму себя.
    тогда и твой вопрос сам собой решиться.
     
  6. VItalijs

    VItalijs Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    select * from menu LEFT JOIN `menu_subcats` ON `menu_subcats`.`menu_name` = `menu`.`name`

    но сравнение по name это ппц какой-то, id зачем нужен тогда?
     
  7. VItalijs

    VItalijs Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    ну и да, одна таблица будет удобнее, ибо можно тогда уровень вложения глубже делать.
     
  8. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Странно как-то это всё...
    [sql]SELECT DISTINCT name FROM (SELECT name FROM menu UNION SELECT value FROM menu_subcats) as t1;[/sql]
    Код (Text):
    1.  
    2. +---------------+
    3. | name          |
    4. +---------------+
    5. | contact       |
    6. | bio           |
    7. | advertisement |
    8. | weddings      |
    9. | fashion       |
    10. | video         |
    11. | home          |
    12. | beauty        |
    13. | fantasi       |
    14. | creative      |
    15. | hairs         |
    16. | celebrities   |
    17. | editorial     |
    18. +---------------+
    19. 13 rows in set (0.00 sec)