2016-06-09 22 views
-4

Hier sind meine beiden Tabellen Struktur,SQL Join zwischen zwei Tabellen

mysql> desc catalog_product_entity; 
+------------------+----------------------+------+-----+---------------------+----------------+ 
| Field   | Type     | Null | Key | Default    | Extra   | 
+------------------+----------------------+------+-----+---------------------+----------------+ 
| entity_id  | int(10) unsigned  | NO | PRI | NULL    | auto_increment | 
| entity_type_id | smallint(8) unsigned | NO | MUL | 0     |    | 
| attribute_set_id | smallint(5) unsigned | NO | MUL | 0     |    | 
| type_id   | varchar(32)   | NO |  | simple    |    | 
| sku    | varchar(64)   | YES | MUL | NULL    |    | 
| created_at  | datetime    | NO |  | 0000-00-00 00:00:00 |    | 
| updated_at  | datetime    | NO |  | 0000-00-00 00:00:00 |    | 
| has_options  | smallint(1)   | NO |  | 0     |    | 
| required_options | tinyint(1) unsigned | NO |  | 0     |    | 
| user_id   | mediumint(11)  | NO |  | NULL    |    | 
+------------------+----------------------+------+-----+---------------------+----------------+ 
10 rows in set (0.00 sec) 

mysql> desc catalog_product_entity_varchar; 
+----------------+-----------------------+------+-----+---------+----------------+ 
| Field   | Type     | Null | Key | Default | Extra   | 
+----------------+-----------------------+------+-----+---------+----------------+ 
| value_id  | int(11)    | NO | PRI | NULL | auto_increment | 
| entity_type_id | mediumint(8) unsigned | NO |  | 0  |    | 
| attribute_id | smallint(5) unsigned | NO | MUL | 0  |    | 
| store_id  | smallint(5) unsigned | NO | MUL | 0  |    | 
| entity_id  | int(10) unsigned  | NO | MUL | 0  |    | 
| value   | varchar(255)   | NO |  |   |    | 
+----------------+-----------------------+------+-----+---------+----------------+ 
6 rows in set (0.00 sec) 

ich zwei Tabellen anschließen möchten, basierend auf folgenden Kriterien

ich alle Werte bilden Tabelle an zweiter Stelle holen wollen catalog_product_entity_varchar wo ENTITY_ID sollte Übereinstimmung mit der ersten Tabelle catalog_product_entity und wobei user_id aus der ersten Tabelle 12 ist.

Unten ist meine SQL-Abfrage -

select entity_id, value, COUNT(*) as count 
    from catalog_product_entity_varchar as cpev 
    INNER JOIN catalog_product_entity as cpe on cpe.entity_id = cpev.entity_id 
    where attribute_id = '960' 
    GROUP BY value 
    HAVING (COUNT(*) > 1) 
    limit 1 

Updates -

ich meine SQL-Abfrage aktualisiert habe, Aber es zeigt nur ein Ergebnis nicht mehr Ergebnisse.

select catalog_product_entity_varchar.entity_id, 
     catalog_product_entity_varchar.value, COUNT(*) as count, 
     catalog_product_entity.entity_id, catalog_product_entity.user_id 
from catalog_product_entity_varchar, 
    catalog_product_entity 
where attribute_id = '960' 
    and catalog_product_entity_varchar.entity_id = catalog_product_entity.entity_id 
    AND catalog_product_entity.user_id = '12' 
GROUP BY value 
HAVING (COUNT(*) > 1) 
limit 1; 

Aktuell Ergebnis -

+-----------+---------------+-------+-----------+---------+ 
| entity_id | value   | count | entity_id | user_id | 
+-----------+---------------+-------+-----------+---------+ 
| 11062505 | 05-04100262-R |  2 | 11062505 |  12 | 
+-----------+---------------+-------+-----------+---------+ 
1 row in set (36.67 sec) 

Erwartetes Ergebnis -

+-----------+----------------+--------------+----------+-----------+---------------+ 
| value_id | entity_type_id | attribute_id | store_id | entity_id | value   | 
+-----------+----------------+--------------+----------+-----------+---------------+ 
| 63606647 |    10 |   960 |  0 | 11062505 | 05-04100262-R | 
| 149826537 |    10 |   960 |  0 | 19987372 | 05-04100262-R | 
+-----------+----------------+--------------+----------+-----------+---------------+ 
2 rows in set (12.84 sec) 

Und auch wir können optimieren diese Abfrage, weil aktuelle Abfrage wird zu viel Zeit

+0

Sie erklären, was mit der Abfrage falsch ist, was es im Gegensatz gibt, wie es sollte sein. –

+0

Könnten Sie Ihre Absicht deutlich machen? Wo ist die Bedingung "user_id" in Ihrer Anfrage "12"? Und andere Bedingungen in Ihrer Abfrage stimmen nicht mit der Absicht überein, die Sie zuvor beschrieben haben? –

+0

Sie machen ein GROUP BY in der Spalte Wert, aber bringen auch die Spalte entity_id zurück. Welcher Wert von entity_id für einen Wert zurückgegeben wird, ist nicht definiert. – Kickstart

Antwort

0

Was Sie scheinen require ist ein einfacher Join, viel einfacher als das von Ihnen gepostete Beispiel-SQL.

Etwas wie folgt aus: -

SELECT cpev.value_id, 
     cpev.entity_type_id, 
     cpev.attribute_id, 
     cpev.store_id, 
     cpev.entity_id, 
     cpev.value 
FROM catalog_product_entity_varchar as cpev 
INNER JOIN catalog_product_entity as cpe on cpe.entity_id = cpev.entity_id 
WHERE cpe.user_id = 12 

aber ich vermute, dass Sie etwas in Ihren verpasst haben.

EDIT

Ich denke, was Sie alles ist zu finden, die Werte zu tun versuchen, die mehr als einmal vorkommen, und dann die Datensätze, die diesen Wert haben bringen. Wenn so eine Unterabfrage verwenden, um die Werte verwendet, mehr als einmal zurückkommen, und dann, dass kommt wieder gegen die Haupttabellen zurück: -

SELECT cpev.value_id, 
     cpev.entity_type_id, 
     cpev.attribute_id, 
     cpev.store_id, 
     cpev.entity_id, 
     cpev.value 
FROM catalog_product_entity_varchar cpev 
INNER JOIN catalog_product_entity cpe ON cpe.entity_id = cpev.entity_id 
INNER JOIN 
(
    SELECT cpev.value, 
      COUNT(*) AS value_count 
    FROM catalog_product_entity_varchar cpev 
    INNER JOIN catalog_product_entity cpe ON cpe.entity_id = cpev.entity_id 
    WHERE cpev.attribute_id = '960' 
    AND cpe.user_id = 12 
    GROUP BY value 
    HAVING value_count > 1 
) sub0 
ON cpev.value = sub0.value 
WHERE cpev.attribute_id = '960' 
AND cpe.user_id = 12 
+1

durch das Beispiel, ich glaube, dass er ihm selbst nicht gut erklären .. – sagi

+0

Ich habe meine Frage aktualisiert. Bitte schauen Sie sich – John

+0

Ich denke, in Ihrer Antwort müssen wir zunächst Tabelle definieren dann definieren Sie den Spaltennamen – John