حدد عمودًا واحدًا متميزًا ، والبعض الآخر يمكن أن يكون غير متميز. - Mysql

StackOverflow https://stackoverflow.com/questions/4613999

سؤال

حسنًا ، لدي جدول مؤقت يحتوي على 135000 صف ، أحاول إدراج بعض القيم من هذا الجدول المؤقت إلى جداول أخرى.

هذا هو المخطط الذي أستخدمه

TVTemptable

+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| PROGTITLE   | text        | YES  |     | NULL    |       |
| SUBTITLE    | text        | YES  |     | NULL    |       |
| EPISODE     | text        | YES  |     | NULL    |       |
| YR          | year(4)     | YES  |     | NULL    |       |
| DIRECTOR    | text        | YES  |     | NULL    |       |
| PERFORMERS  | text        | YES  |     | NULL    |       |
| PREMIERE    | tinyint(1)  | YES  |     | NULL    |       |
| FILM        | tinyint(1)  | YES  |     | NULL    |       |
| RPEAT       | tinyint(1)  | YES  |     | NULL    |       |
| SUBTITLES   | tinyint(1)  | YES  |     | NULL    |       |
| WIDESCREEN  | tinyint(1)  | YES  |     | NULL    |       |
| NEWSERIES   | tinyint(1)  | YES  |     | NULL    |       |
| DEAFSIGNED  | tinyint(1)  | YES  |     | NULL    |       |
| BNW         | tinyint(1)  | YES  |     | NULL    |       |
| STARRATING  | tinyint(4)  | YES  |     | NULL    |       |
| CERTIFICATE | varchar(5)  | YES  |     | NULL    |       |
| GENRE       | varchar(50) | YES  |     | NULL    |       |
| DESCRIPTION | text        | YES  |     | NULL    |       |
| CHOICE      | tinyint(1)  | YES  |     | NULL    |       |
| PROGDATE    | date        | YES  |     | NULL    |       |
| STARTIME    | time        | YES  |     | NULL    |       |
| ENDTIME     | time        | YES  |     | NULL    |       |
| DURATION    | int(11)     | YES  |     | NULL    |       |
| CHANNELID   | int(11)     | NO   |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+

القنوات

+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| CHANNELID   | int(11)     | NO   | PRI | NULL    | auto_increment |
| CHANNELNAME | varchar(50) | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+

النوع

+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| GENREID   | int(11)     | NO   | PRI | NULL    | auto_increment |
| GENRENAME | varchar(50) | YES  |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+

برنامج

+-------------+------------+------+-----+---------+----------------+
| Field       | Type       | Null | Key | Default | Extra          |
+-------------+------------+------+-----+---------+----------------+
| PROGRAMMEID | int(11)    | NO   | PRI | NULL    | auto_increment |
| GENREID     | int(11)    | NO   | MUL | NULL    |                |
| PROGTITLE   | text       | YES  |     | NULL    |                |
| YR          | year(4)    | YES  |     | NULL    |                |
| DIRECTOR    | text       | YES  |     | NULL    |                |
| PERFORMERS  | text       | YES  |     | NULL    |                |
| FILM        | tinyint(1) | YES  |     | NULL    |                |
| WIDESCREEN  | tinyint(1) | YES  |     | NULL    |                |
| BNW         | tinyint(1) | YES  |     | NULL    |                |
| CERTIFICATE | varchar(5) | YES  |     | NULL    |                |
| DESCRIPTION | text       | YES  |     | NULL    |                |
+-------------+------------+------+-----+---------+----------------+

حلقة

+-------------+---------+------+-----+---------+----------------+
| Field       | Type    | Null | Key | Default | Extra          |
+-------------+---------+------+-----+---------+----------------+
| EPISODEID   | int(11) | NO   | PRI | NULL    | auto_increment |
| PROGRAMMEID | int(11) | NO   | MUL | NULL    |                |
| SUBTITLE    | text    | YES  |     | NULL    |                |
| EPISODE     | text    | YES  |     | NULL    |                |
| DIRECTOR    | text    | YES  |     | NULL    |                |
| PERFORMERS  | text    | YES  |     | NULL    |                |
| DESCRIPTION | text    | YES  |     | NULL    |                |
+-------------+---------+------+-----+---------+----------------+

ChannelProgramme

+--------------------+------------+------+-----+---------+----------------+
| Field              | Type       | Null | Key | Default | Extra          |
+--------------------+------------+------+-----+---------+----------------+
| CHANNELPROGRAMMEID | int(11)    | NO   | PRI | NULL    | auto_increment |
| CHANNELID          | int(11)    | NO   | MUL | NULL    |                |
| PROGRAMMEID        | int(11)    | NO   | MUL | NULL    |                |
| EPISODEID          | int(11)    | NO   | MUL | NULL    |                |
| RPEAT              | tinyint(1) | YES  |     | NULL    |                |
| NEWSERIES          | tinyint(1) | YES  |     | NULL    |                |
| PREMIERE           | tinyint(1) | YES  |     | NULL    |                |
| CHOICE             | tinyint(1) | YES  |     | NULL    |                |
| SUBTITLES          | tinyint(1) | YES  |     | NULL    |                |
| DEAFSIGNED         | tinyint(1) | YES  |     | NULL    |                |
| STARRATING         | tinyint(4) | YES  |     | NULL    |                |
| PROGDATE           | date       | YES  |     | NULL    |                |
| STARTTIME          | time       | YES  |     | NULL    |                |
| ENDTIME            | time       | YES  |     | NULL    |                |
| DURATION           | tinyint(4) | YES  |     | NULL    |                |
+--------------------+------------+------+-----+---------+----------------+

لذا ، فإن قاعدة بيانات قاعدة البيانات هي قاعدة بيانات لقوائم التلفزيون ، ويحتوي جدول Mannerprogramme على جميع إدخالات كل عرض على كل قناة ، ويحتوي جدول البرنامج على إدخالات فريدة لكل برنامج الحلقات

أعتقد أن ارتباك هو أنني أرغب في تحديد progtitles المتميزين من الجدول المؤقت لإلغاء جدول البرنامج ، لكنني أريد بعض المعلومات الأخرى معها.

على سبيل المثال إذا فعلت

select distinct(progtitle) from tvtemptable;

سيعود لي فقط القيمة لعمود progtitle ، في حين أن ما أريده بالفعل هو progtitle بالإضافة إلى بعض الأشياء الأخرى.

لذلك إذا حاولت تحديد مزيد من المعلومات مثل ذلك

mysql> select distinct progtitle, yr, director, film from tvtemptable
limit 30;
+-----------------------------------+------+---------------------+------+
| progtitle                         | yr   | director            | film |
+-----------------------------------+------+---------------------+------+
| Teleshopping                      | 2000 |                     |    0 |
| Cinemania                         | 2000 |                     |    0 |
| Whose Line Is It Anyway?          | 2000 |                     |    0 |
| Just Desserts                     | 2004 | Kevin Connor        |    1 |
| Law & Order                       | 2000 | Matthew Penn        |    0 |
| Jane Doe: Yes, I Remember it Well | 2006 | Armand Mastroianni  |    0 |
| CSI: NY                           | 2000 | David Jackson       |    0 |
| CSI: Crime Scene Investigation    | 2000 | Kenneth Fink        |    0 |
| NCIS                              | 2000 | Colin Bucksey       |    0 |
| CSI: Miami                        | 2000 |                     |    0 |
| Enter the Dragon                  | 1973 | Robert Clouse       |    1 |
| Close                             | 2000 |                     |    0 |
| My Son Is Innocent                | 1996 | Larry Elikann       |    1 |
| Law & Order                       | 2000 | Christopher Misiano |    0 |
| Murder 101                        | 2006 | Christian I Nyby II |    1 |
| CSI: NY                           | 2000 | Christine Moore     |    0 |
| CSI: Crime Scene Investigation    | 2000 | Bill Eagles         |    0 |
| Rush Hour                         | 1998 | Brett Ratner        |    1 |
| Dark Blue                         | 2000 | Jeffrey Hunt        |    0 |
| CSI: Crime Scene Investigation    | 2000 | Richard J Lewis     |    0 |
| Ordinary Miracles                 | 2005 | Michael Switzer     |    1 |
| Law & Order                       | 2000 | Jace Alexander      |    0 |
| Wounded Heart                     | 1995 | Vic Sarin           |    1 |
| CSI: NY                           | 2000 | Jonathan Glassner   |    0 |
| Dark Blue                         | 2000 | Nathan Hope         |    0 |
| Blade: The Series                 | 2000 | Michael Robison     |    0 |
| K-Ville                           | 2000 | Kevin Dowling       |    0 |
| Law & Order                       | 2000 | Jim Ellis           |    0 |
| Reasons of the Heart              | 1996 | Rick Jacobson       |    1 |
| CSI: NY                           | 2000 | Anthony Hemingway   |    0 |
+-----------------------------------+------+---------------------+------+

سيكون هناك عدد قليل من التكرارات في عمود progtitle. لا تتكرر البرامج لكل مدير جديد ، وهناك مخرجون مختلفون أعلاه لبعض البرامج لأن تلك البرامج لديها حلقات.

لقد تمكنت الآن من الحصول على SELECT للعمل بشكل صحيح إذا كنت بحاجة فقط إلى عمود إضافي على سبيل المثال

select distinct
    t1.progtitle,
   (select
        t2.director
    from
        tvtemptable t2
    where 
        t1.progtitle = t2.progtitle
    limit 1) as "Director"
from
    tvtemptable t1 limit 10;

+-----------------------------------+--------------------+
| progtitle                         | Director           |
+-----------------------------------+--------------------+
| Teleshopping                      |                    |
| Cinemania                         |                    |
| Whose Line Is It Anyway?          |                    |
| Just Desserts                     | Kevin Connor       |
| Law & Order                       | Matthew Penn       |
| Jane Doe: Yes, I Remember it Well | Armand Mastroianni |
| CSI: NY                           | David Jackson      |
| CSI: Crime Scene Investigation    | Kenneth Fink       |
| NCIS                              | Colin Bucksey      |
| CSI: Miami                        |                    |
+-----------------------------------+--------------------+

من الواضح أن هذا سوف يصبح فوضويًا إذا أردت تحديد أكثر من عمود إضافي

إذن ما هي أفضل طريقة للقيام بذلك؟

هذا هو أمر إدراج الخاص بي لملء جدول البرنامج من الجدول المؤقت ، وهو حاليًا لديه نفس المشكلة مع التكرارات في المثال المحدد الذي أعطيته أعلاه.

INSERT INTO PROGRAMME (
    PROGTITLE, GENREID, YR, DIRECTOR,
    PERFORMERS, FILM, WIDESCREEN, BNW,
    CERTIFICATE, DESCRIPTION)
SELECT DISTINCT
    T.PROGTITLE, G.GENREID, T.YR, T.DIRECTOR,
    T.PERFORMERS, T.FILM, T.WIDESCREEN, T.BNW,
    T.CERTIFICATE, T.DESCRIPTION
FROM
    TVTEMPTABLE T
    INNER JOIN GENRE G ON G.GENRENAME=T.GENRE
    LEFT JOIN PROGRAMME P ON P.PROGTITLE=T.PROGTITLE
WHERE
    P.PROGTITLE IS NULL
هل كانت مفيدة؟

المحلول

هل أنا محق في افتراض أن TVTEMPTABLE هل نتيجة انضمام الجداول من مكان ما؟

إذا كان هذا هو الحال ، أعتقد أنه سيكون لديك وظيفة أسهل بشكل عام ، إذا قمت أولاً بتقسيم جدول Temp إلى جداول مؤقتة متعددة لها نفس تنسيق الجداول المستهدفة.

على سبيل المثال (وأنا لا أعرف بياناتك لذلك أعتقد فقط):

-- All genres (matches your existing genres table)
create table genres_temp as
   select distinct genre
     from tvtemptable;

-- All programmes (matches your existing programme table)
create table programmes_temp as
   select distinct all_the_programme_columns
     from tvtemptable;

-- Contains the many-to-many relationship between genres and programmes
create table programme_genre_temp as 
   select distinct genre, progtitle
     from tvtemptable;

ما سبق لا يجيب على سؤالك ، لكنه قد يمنحك بعض الأفكار التي تسلب المشكلة ، والتي يبدو أنها تتكرر معلومات البرنامج لكل منها شيئا ما. تحتاج إلى معرفة ما هو عليه.

محدثلذلك يتكرر كل برنامج مرة واحدة لكل مدير؟ ثم نهج بلدي أعلاه هو أكثر منطقية: استخراج الكيانات ، والعلاقات أولا.

تحديث 2حسنًا ، أنت تجبر المخرج على البرنامج ، عندما يرتبط المخرج بالحلقة؟ سيكون هذا خطأ في النمذجة على ما يبدو. على أي حال ، إذا كنت لا تهتم بالمخرج الذي تختاره ، فيمكنك التجميع progtitle والاستخدام MAX() حول جميع الأعمدة الأخرى. سوف يمنحك هذا progtitles مميزة وواحدة من القيم لبقية الأعمدة.

SELECT T.PROGTITLE, max(G.GENREID), max(T.YR), max(T.DIRECTOR), etc
  FROM TVTEMPTABLE T
 INNER JOIN GENRE G ON G.GENRENAME=T.GENRE
       LEFT JOIN PROGRAMME P ON P.PROGTITLE=T.PROGTITLE
 WHERE P.PROGTITLE IS NULL
 group by T.PROGTITLE;

نصائح أخرى

هذا لا معنى له. كيف يمكن أن يكون الصف متميزًا جزئيًا وغير متميز جزئيًا؟ فكر في النتيجة المحددة كجدول - كيف تمثل البيانات ، إذا كانت هناك قيمة واحدة PROGTITLE أن لديه قيم متعددة لبقية الأعمدة؟

هذا لا يجيب على سؤالك ، ولكن ربما يجيب على هؤلاء الأشخاص الذين يتجولون في طريقهم إلى هنا:

في postgresql ، يمكنك القيام بذلك باستخدام Select Direction On ، على سبيل المثال:

SELECT DISTINCT ON (p.progtitle) p.* FROM progtitle p;

لا أعرف أي ما يعادل MySQL.

Insert into xx (a,b) 
Select a.ab, b.bb from (
Select distinct ab from a) a, (select distinct bb from b) b

أقرأ أن ما تريده هو قائمة بالبرامج المتميزة ، ولكن مع بعض البيانات المرتبطة بها في الأعمدة الأخرى للسياق؟ يمكنك القيام بذلك مع أرقام الصفوف.

select * from
 (select *,
         row_number() over (partition by progtitle order by year desc) N
    from tvtempta) t
where t.N = 1

والأفضل من ذلك ، يمكنك استخدام order by بند لتحديد أحدث طريقة مفضلة أو أخرى أو بعضها لاختيار الصف الذي تريده. هذا هو بناء جملة T-SQL وأعتقد أن الجملة نفسها يجب أن تعمل في Oracle (إن لم يكن ذلك ممكنًا بالتأكيد في Oracle). لسوء الحظ ، لا أعرف ما إذا كان يمكنك القيام بذلك في MySQL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top